v0.1.0-pre.011

This commit is contained in:
2026-07-24 14:23:58 +02:00
parent 62bc0ffb44
commit 42e8a203ec
460 changed files with 12005 additions and 7020 deletions

5
.pydevproject Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?><pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python interpreter</pydev_property>
</pydev_project>

View File

@@ -1,3 +1,6 @@
<!-- file: CHANGELOG.md -->
<!-- version: 1 -->
# CHANGELOG # CHANGELOG
## 0.1.0-pre.001 ## 0.1.0-pre.001
@@ -19,5 +22,10 @@
- Portage des contrats complets de `kb_decoder_api` dans `kb-lib::decoder::api`. - Portage des contrats complets de `kb_decoder_api` dans `kb-lib::decoder::api`.
- Portage des contrats complets de `kb_materializer_api` dans `kb-lib::materializer::api`. - Portage des contrats complets de `kb_materializer_api` dans `kb-lib::materializer::api`.
- Portage des contrats complets de `kb_execution_api` dans `kb-lib::executor::api`. - Portage des contrats complets de `kb_execution_api` dans `kb-lib::executor::api`.
- Ajout du contrat neutre `CoreInstructionReplayInput` dans `kb-lib` pour éviter une dépendance cyclique avec `kb-store`. - Ajout du contrat neutre `MdCoreInstructionReplayInput` dans `kb-lib` pour éviter une dépendance cyclique avec `kb-store`.
- `kb-lib/src/lib.rs` reste une façade de modules et de réexports. - `kb-lib/src/lib.rs` reste une façade de modules et de réexports.
## 0.1.0-pre.010
- Portage des matérialisateurs natifs lifecycle, administration, compliance et staking.
- Conservation de leurs 50 tests historiques et ajout du premier test aval de matérialisation.

View File

@@ -1,5 +1,5 @@
<!-- file: README.md --> <!-- file: README.md -->
<!-- version: 7 --> <!-- version: 8 -->
# Khadhroony Bot3 # Khadhroony Bot3
@@ -63,9 +63,19 @@ cargo clippy --workspace --all-targets
`0.1.0-pre.010` porte les quatre matérialisateurs Solana natifs dans `kb-lib` : `0.1.0-pre.010` porte les quatre matérialisateurs Solana natifs dans `kb-lib` :
- `LifecycleMaterializer` pour les comptes System, nonces, ALT, loaders, Feature Gate, contextes ZK et rapports Slashing ; - `MtLifecycleMaterializer` pour les comptes System, nonces, ALT, loaders, Feature Gate, contextes ZK et rapports Slashing ;
- `AdminMaterializer` pour les assignations, configurations et autorités, avec ses projections stateful Token2022 et registre ElGamal ; - `MtAdminMaterializer` pour les assignations, configurations et autorités, avec ses projections stateful Token2022 et registre ElGamal ;
- `ComplianceAuditMaterializer` pour les écritures et copies bornées de bytecode ; - `MtComplianceAuditMaterializer` pour les écritures et copies bornées de bytecode ;
- `StakingMaterializer` pour les transitions Stake et Vote commitées. - `MtStakingMaterializer` pour les transitions Stake et Vote commitées.
Les identités historiques des processors sont conservées pour la compatibilité des replays, tandis que les targets de tracing suivent désormais la hiérarchie `kb-lib.materializer.*`. Le contrat public `EventMaterializer`, ses modèles dentrée et ses résultats restent réexportés à la racine de `kb-lib`, afin quun futur crate externe puisse fournir un matérialiseur sans dépendre dune implémentation interne. Les identités historiques des processors sont conservées pour la compatibilité des replays, tandis que les targets de tracing suivent désormais la hiérarchie `kb-lib.materializer.*`. Le contrat public `MtApiEventMaterializer`, ses modèles dentrée et ses résultats restent réexportés à la racine de `kb-lib`, afin quun futur crate externe puisse fournir un matérialiseur sans dépendre dune implémentation interne.
`0.1.0-pre.011` termine le port des matérialisateurs réellement implémentés dans bot2 :
- `MtTransactionAnnotationMaterializer` pour les Memo commitées ;
- `MtTokenAccountsMaterializer` pour les mutations SPL Token, le lifecycle ATA et les snapshots Token2022 ;
- `MtFeesMaterializer` pour les frais publics et confidentiels Token2022, sans prétendre déchiffrer les valeurs confidentielles ;
- `MtRiskMaterializer` pour les faits de risque SPL Token et ATA sans score arbitraire ;
- `MtMetadataMaterializer` pour les snapshots descriptifs Token2022 et Metaplex, sans fetch off-chain.
Les modules de matérialisation sont privés. Tous les contrats, types concrets et helpers destinés aux consommateurs externes sont exposés exclusivement par `kb-lib/src/lib.rs`. Des tests aval distincts protègent les contrats dextension `DcApiProtocolDecoder`, `MtApiEventMaterializer` et `ExApiInstructionExecutor`.

View File

@@ -1,5 +1,5 @@
<!-- file: ROADMAP.md --> <!-- file: ROADMAP.md -->
<!-- version: 8 --> <!-- version: 9 -->
# ROADMAP — khadhroony-bot3 # ROADMAP — khadhroony-bot3
@@ -13,8 +13,8 @@
- [x] Porter exactement les contrats publics de `kb_decoder_api`. - [x] Porter exactement les contrats publics de `kb_decoder_api`.
- [x] Porter exactement les contrats publics des APIs dexécution et de matérialisation. - [x] Porter exactement les contrats publics des APIs dexécution et de matérialisation.
- [x] Porter les modèles de `kb_model` vers `kb-lib`. - [x] Porter les modèles de `kb_model` vers `kb-lib`.
- [~] Porter les décodeurs Solana core, SPL et Metaplex. - [x] Porter les décodeurs Solana core, SPL et Metaplex déjà implémentés dans bot2.
- [~] Porter leurs matérialisateurs. - [x] Porter leurs matérialisateurs déjà implémentés dans bot2.
- [ ] Porter leurs exécuteurs. - [ ] Porter leurs exécuteurs.
- [x] Fusionner `kb_store_core` et `kb_store_pg` dans `kb-store`. - [x] Fusionner `kb_store_core` et `kb_store_pg` dans `kb-store`.
- [ ] Adapter `kb-pipeline` aux nouveaux chemins publics. - [ ] Adapter `kb-pipeline` aux nouveaux chemins publics.
@@ -37,7 +37,7 @@
- [x] Remplacer le scaffold par une architecture intégrée contrats/adaptateurs. - [x] Remplacer le scaffold par une architecture intégrée contrats/adaptateurs.
- [x] Porter les DTO, entités, traits et validations store-neutral. - [x] Porter les DTO, entités, traits et validations store-neutral.
- [x] Porter ladaptateur PostgreSQL, ses requêtes, diagnostics et initialisations idempotentes. - [x] Porter ladaptateur PostgreSQL, ses requêtes, diagnostics et initialisations idempotentes.
- [x] Conserver `CoreInstructionReplayInput` dans `kb-lib` et le réexporter depuis `kb-store`. - [x] Conserver `MdCoreInstructionReplayInput` dans `kb-lib` et le réexporter depuis `kb-store`.
- [x] Supprimer la dépendance directe de `kb-store` vers `kb-config`. - [x] Supprimer la dépendance directe de `kb-store` vers `kb-config`.
- [x] Adapter les règles bot2 devenues incompatibles avec larchitecture bot3. - [x] Adapter les règles bot2 devenues incompatibles avec larchitecture bot3.
- [x] Valider `cargo check`, les 84 tests et Clippy pour `kb-store`, puis `cargo check --workspace`. - [x] Valider `cargo check`, les 84 tests et Clippy pour `kb-store`, puis `cargo check --workspace`.
@@ -90,7 +90,7 @@
### 0.1.0-pre.008 — Décodeurs Token2022 et registre ElGamal dans `kb-lib` ### 0.1.0-pre.008 — Décodeurs Token2022 et registre ElGamal dans `kb-lib`
- [x] Remplacer les scaffolds `token_2022` et `elgamal_registry` par les décodeurs exacts validés de bot2. - [x] Remplacer les scaffolds `token2022` et `elgamal_registry` par les décodeurs exacts validés de bot2.
- [x] Conserver les 48 enveloppes Token2022, les sous-instructions dextensions identifiables et les interfaces Metadata/Group incorporées. - [x] Conserver les 48 enveloppes Token2022, les sous-instructions dextensions identifiables et les interfaces Metadata/Group incorporées.
- [x] Porter le parseur borné des états Mint, Account et Multisig avec leurs entrées TLV ordonnées. - [x] Porter le parseur borné des états Mint, Account et Multisig avec leurs entrées TLV ordonnées.
- [x] Maintenir le registre ElGamal comme programme indépendant avec ses deux instructions et son état de compte exact de 64 octets. - [x] Maintenir le registre ElGamal comme programme indépendant avec ses deux instructions et son état de compte exact de 64 octets.
@@ -117,12 +117,25 @@
### 0.1.0-pre.010 — Matérialisateurs Solana natifs dans `kb-lib` ### 0.1.0-pre.010 — Matérialisateurs Solana natifs dans `kb-lib`
- [x] Porter `LifecycleMaterializer`, `AdminMaterializer`, `ComplianceAuditMaterializer` et `StakingMaterializer` dans les modules consolidés de `kb-lib`. - [x] Porter `MtLifecycleMaterializer`, `MtAdminMaterializer`, `MtComplianceAuditMaterializer` et `MtStakingMaterializer` dans les modules consolidés de `kb-lib`.
- [x] Conserver leurs 50 tests de projections natives, de politique de transaction et didempotence. - [x] Conserver leurs 50 tests de projections natives, de politique de transaction et didempotence.
- [x] Réexporter les types concrets et les fonctions stateful publiques depuis la façade de `kb-lib`. - [x] Réexporter les types concrets et les fonctions stateful publiques depuis la façade de `kb-lib`.
- [x] Ajouter un test dintégration aval prouvant quun futur crate externe peut implémenter `EventMaterializer` avec la seule API publique. - [x] Ajouter un test dintégration aval prouvant quun futur crate externe peut implémenter `MtApiEventMaterializer` avec la seule API publique.
- [x] Porter les targets vers `kb-lib.materializer.admin`, `kb-lib.materializer.compliance`, `kb-lib.materializer.lifecycle` et `kb-lib.materializer.staking`. - [x] Porter les targets vers `kb-lib.materializer.admin`, `kb-lib.materializer.compliance`, `kb-lib.materializer.lifecycle` et `kb-lib.materializer.staking`.
- [x] Conserver les identités de processor historiques afin de préserver les clés de replay et didempotence existantes. - [x] Conserver les identités de processor historiques afin de préserver les clés de replay et didempotence existantes.
- [x] Ajouter la règle dordre et dabsence de ligne vide interne dans les blocs de réexports publics. - [x] Ajouter la règle dordre et dabsence de ligne vide interne dans les blocs de réexports publics.
- [ ] Valider les 371 tests attendus de `kb-lib`, Clippy et le workspace avec Cargo sur la machine de développement. - [x] Valider les 370 tests unitaires et le test dintégration de `kb-lib`, Clippy et le workspace avec Cargo sur la machine de développement.
- [ ] Poursuivre avec les matérialisateurs Memo, SPL Token, ATA, Token2022, registre ElGamal et Metaplex. - [x] Poursuivre avec les matérialisateurs Memo, SPL Token, ATA, Token2022, registre ElGamal et Metaplex.
### 0.1.0-pre.011 — Matérialisateurs SPL et Metaplex dans `kb-lib`
- [x] Porter `MtTransactionAnnotationMaterializer`, `MtTokenAccountsMaterializer`, `MtFeesMaterializer`, `MtRiskMaterializer` et `MtMetadataMaterializer`.
- [x] Conserver leurs 45 tests historiques, en plus des 370 tests unitaires déjà validés.
- [x] Réexporter à la racine les cinq types concrets, les fonctions de snapshots Token2022/Metaplex et les types canoniques Metaplex nécessaires à leurs signatures publiques.
- [x] Rendre privée toute larborescence `kb-lib::materializer` et interdire mécaniquement tout nouveau `pub mod` dans cette frontière.
- [x] Étendre les tests aval aux trois contrats dextension publics : `DcApiProtocolDecoder`, `MtApiEventMaterializer` et `ExApiInstructionExecutor`.
- [x] Étendre laudit aux lignes vides internes des blocs homogènes `pub use` et `pub(crate) use`.
- [x] Porter les targets de risque, comptes Token et annotations vers `kb-lib.materializer.risk`, `kb-lib.materializer.token` et `kb-lib.materializer.transaction` dans les trois profils.
- [x] Maintenir le fetch HTTP/IPFS/Arweave hors de `kb-lib`, dans une future crate off-chain dédiée.
- [ ] Valider les 415 tests unitaires et les trois tests dintégration de `kb-lib`, Clippy et le workspace avec Cargo sur la machine de développement.
- [ ] Poursuivre avec les exécuteurs déjà implémentés dans bot2.

View File

@@ -138,7 +138,7 @@ Aucun renommage massif de modules n'est autorisé sans étape de contrôle dédi
- Une crate ou un composant de `kb-lib` est opérationnel lorsquil effectue des I/O, orchestre un pipeline, décode, matérialise, exécute, applique une politique runtime ou prend une décision mutable observable. - Une crate ou un composant de `kb-lib` est opérationnel lorsquil effectue des I/O, orchestre un pipeline, décode, matérialise, exécute, applique une politique runtime ou prend une décision mutable observable.
- Toute crate opérationnelle ajoutée ou modifiée doit dépendre de `tracing` depuis le workspace et déclarer exactement un `pub(crate) const TRACING_TARGET` dans `src/constants.rs`. - Toute crate opérationnelle ajoutée ou modifiée doit dépendre de `tracing` depuis le workspace et déclarer exactement un `pub(crate) const TRACING_TARGET` dans `src/constants.rs`.
- Hors `kb-lib`, la valeur canonique de `TRACING_TARGET` est le nom exact du package Cargo. - Hors `kb-lib`, la valeur canonique de `DC_METADATA_MTM_TRACING_TARGET` est le nom exact du package Cargo.
- Dans `kb-lib`, chaque composant opérationnel possède son propre `constants.rs` et un target hiérarchique stable fondé sur son identifiant de décodeur, matérialiseur ou exécuteur ; un target unique `kb-lib` ne doit pas effacer l'identité du composant. - Dans `kb-lib`, chaque composant opérationnel possède son propre `constants.rs` et un target hiérarchique stable fondé sur son identifiant de décodeur, matérialiseur ou exécuteur ; un target unique `kb-lib` ne doit pas effacer l'identité du composant.
- Les targets historiques `khbot.*` et les targets de fenêtre sont interdits dans les nouvelles modifications. - Les targets historiques `khbot.*` et les targets de fenêtre sont interdits dans les nouvelles modifications.
- Les macros `tracing` doivent utiliser `target: crate::TRACING_TARGET` et des champs structurés stables. La granularité interne passe par `action`, `stage`, `window`, `campaign_id`, `signature`, `instruction_path`, `program_id`, `processor_name`, `processor_version`, `status` et `error_code`. - Les macros `tracing` doivent utiliser `target: crate::TRACING_TARGET` et des champs structurés stables. La granularité interne passe par `action`, `stage`, `window`, `campaign_id`, `signature`, `instruction_path`, `program_id`, `processor_name`, `processor_version`, `status` et `error_code`.
@@ -152,14 +152,14 @@ Aucun renommage massif de modules n'est autorisé sans étape de contrôle dédi
- Chaque profil doit router les événements vers les sorties globales `debug.log`, `info.log`, `error.jsonl` et `app.log`, puis vers `debug.log`, `info.log` et `error.jsonl` dans un répertoire propre à chaque crate utilisant `tracing`. - Chaque profil doit router les événements vers les sorties globales `debug.log`, `info.log`, `error.jsonl` et `app.log`, puis vers `debug.log`, `info.log` et `error.jsonl` dans un répertoire propre à chaque crate utilisant `tracing`.
- Lajout ou la suppression de `tracing.workspace = true` dans une crate impose la mise à jour simultanée de la matrice de routes, de ses tests et de `docs/TRACING_CONTRACT.md`. - Lajout ou la suppression de `tracing.workspace = true` dans une crate impose la mise à jour simultanée de la matrice de routes, de ses tests et de `docs/TRACING_CONTRACT.md`.
- Le contrat détaillé est défini dans `docs/TRACING_CONTRACT.md`. - Le contrat détaillé est défini dans `docs/TRACING_CONTRACT.md`.
- Laudit mécanique spécifique au projet est exécuté par `python3 scripts/audit_khadhroony_workspace_rules.py`. Il couvre notamment `TRACING_TARGET` et lusage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`. - Laudit mécanique spécifique au projet est exécuté par `python3 scripts/audit_khadhroony_workspace_rules.py`. Il couvre notamment `DC_METADATA_MTM_TRACING_TARGET` et lusage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`.
## Règles de réutilisation des interfaces Solana et SPL ## Règles de réutilisation des interfaces Solana et SPL
- Les dépendances déclarées dans `[workspace.dependencies]` forment un catalogue de versions et de features autorisées ; elles ne doivent être ajoutées à une crate consommatrice que lorsquun type, un encodeur, un décodeur ou un identifiant officiel est réellement utilisé. - Les dépendances déclarées dans `[workspace.dependencies]` forment un catalogue de versions et de features autorisées ; elles ne doivent être ajoutées à une crate consommatrice que lorsquun type, un encodeur, un décodeur ou un identifiant officiel est réellement utilisé.
- Dans un `Cargo.toml`, placer dans `[dependencies]` toute crate référencée par le code de bibliothèque compilé en production. Réserver `[dev-dependencies]` aux références contenues exclusivement dans `#[cfg(test)]`, les tests dintégration, benches ou exemples. Une dépendance de test vers un décodeur ou matérialiseur concret est légitime lorsquelle sert uniquement à éprouver une orchestration générique fondée sur les traits API ; elle ne prouve pas quune capacité de production manque. Toute promotion de `dev-dependencies` vers `dependencies` doit être motivée par un appel runtime réel, et toute dépendance runtime inutilisée doit être supprimée. - Dans un `Cargo.toml`, placer dans `[dependencies]` toute crate référencée par le code de bibliothèque compilé en production. Réserver `[dev-dependencies]` aux références contenues exclusivement dans `#[cfg(test)]`, les tests dintégration, benches ou exemples. Une dépendance de test vers un décodeur ou matérialiseur concret est légitime lorsquelle sert uniquement à éprouver une orchestration générique fondée sur les traits API ; elle ne prouve pas quune capacité de production manque. Toute promotion de `dev-dependencies` vers `dependencies` doit être motivée par un appel runtime réel, et toute dépendance runtime inutilisée doit être supprimée.
- Les registres de composition runtime des applications doivent énumérer explicitement chaque décodeur et matérialiseur concret activé. Toute nouvelle surface instructionnelle dotée dun `EventMaterializer` doit être ajoutée au registre applicatif et couverte par un test dinventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` nest pas activée automatiquement. Les matérialiseurs exclusivement stateful qui nimplémentent pas `EventMaterializer` restent routés par leurs APIs de snapshots dédiées. - Les registres de composition runtime des applications doivent énumérer explicitement chaque décodeur et matérialiseur concret activé. Toute nouvelle surface instructionnelle dotée dun `MtApiEventMaterializer` doit être ajoutée au registre applicatif et couverte par un test dinventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` nest pas activée automatiquement. Les matérialiseurs exclusivement stateful qui nimplémentent pas `MtApiEventMaterializer` restent routés par leurs APIs de snapshots dédiées.
- Les corrélations instruction/état doivent produire une issue explicite (`confirmed`, `contradicted` ou `not_applicable`) et ne doivent jamais transformer automatiquement une configuration observée en violation, score ou conclusion métier. - Les corrélations instruction/état doivent produire une issue explicite (`confirmed`, `contradicted` ou `not_applicable`) et ne doivent jamais transformer automatiquement une configuration observée en violation, score ou conclusion métier.
- Une interface officielle Solana ou SPL étroite doit être préférée à `solana-sdk` lorsque son contrat suffit. - Une interface officielle Solana ou SPL étroite doit être préférée à `solana-sdk` lorsque son contrat suffit.
- Lordre de préférence des formats est : schéma officiel `wincode`, schéma officiel Borsh, puis parseur local borné reproduisant exactement le runtime lorsque linterface officielle nexpose que `bincode`. - Lordre de préférence des formats est : schéma officiel `wincode`, schéma officiel Borsh, puis parseur local borné reproduisant exactement le runtime lorsque linterface officielle nexpose que `bincode`.
@@ -244,7 +244,7 @@ Les `program_id` connus doivent être définis une seule fois dans `kb-program-i
- Toute API publique portée depuis une ancienne crate doit être réexportée au crate root de `kb-lib`. - Toute API publique portée depuis une ancienne crate doit être réexportée au crate root de `kb-lib`.
- `kb-store` regroupe les contrats store-neutral et les adaptateurs de persistance, avec PostgreSQL comme adaptateur de production initial. - `kb-store` regroupe les contrats store-neutral et les adaptateurs de persistance, avec PostgreSQL comme adaptateur de production initial.
- `kb-store/src/lib.rs` reste une façade : les DTO, entités, traits, requêtes et implémentations résident dans des modules privés dédiés et toute API publique est réexportée au crate root. - `kb-store/src/lib.rs` reste une façade : les DTO, entités, traits, requêtes et implémentations résident dans des modules privés dédiés et toute API publique est réexportée au crate root.
- Les modèles source-neutral partagés avec les décodeurs, notamment `CoreInstructionReplayInput`, appartiennent à `kb-lib`; `kb-store` les consomme et les réexporte sans les dupliquer. - Les modèles source-neutral partagés avec les décodeurs, notamment `MdCoreInstructionReplayInput`, appartiennent à `kb-lib`; `kb-store` les consomme et les réexporte sans les dupliquer.
- `kb-lib` ne dépend jamais de `kb-store`. Cette direction de dépendance évite tout cycle entre modèles, décodage et persistance. - `kb-lib` ne dépend jamais de `kb-store`. Cette direction de dépendance évite tout cycle entre modèles, décodage et persistance.
- `kb-store` ne dépend pas de `kb-config`. La frontière applicative transforme une configuration résolue en options de store explicitement validées. - `kb-store` ne dépend pas de `kb-config`. La frontière applicative transforme une configuration résolue en options de store explicitement validées.
- Les adaptateurs concrets implémentent les mêmes traits neutres et ne font pas fuiter leurs types de connexion dans les contrats. - Les adaptateurs concrets implémentent les mêmes traits neutres et ne font pas fuiter leurs types de connexion dans les contrats.

View File

@@ -28,7 +28,7 @@
"kb-lib.decoder.spl.elgamal_registry", "kb-lib.decoder.spl.elgamal_registry",
"kb-lib.decoder.spl.memo", "kb-lib.decoder.spl.memo",
"kb-lib.decoder.spl.token", "kb-lib.decoder.spl.token",
"kb-lib.decoder.spl.token_2022", "kb-lib.decoder.spl.token2022",
"kb_execution_solana", "kb_execution_solana",
"kb_executor_metadata_metaplex_token_metadata", "kb_executor_metadata_metaplex_token_metadata",
"kb_executor_metadata_spl_name_service", "kb_executor_metadata_spl_name_service",
@@ -40,15 +40,15 @@
"kb_executor_spl_noop", "kb_executor_spl_noop",
"kb_executor_spl_single_pool", "kb_executor_spl_single_pool",
"kb_executor_spl_token", "kb_executor_spl_token",
"kb_executor_spl_token_2022", "kb_executor_spl_token2022",
"kb-logging", "kb-logging",
"kb-lib.materializer.admin", "kb-lib.materializer.admin",
"kb-lib.materializer.compliance", "kb-lib.materializer.compliance",
"kb-lib.materializer.lifecycle", "kb-lib.materializer.lifecycle",
"kb_materializer_risk", "kb-lib.materializer.risk",
"kb-lib.materializer.staking", "kb-lib.materializer.staking",
"kb_materializer_token_accounts", "kb-lib.materializer.token",
"kb_materializer_transaction_annotations", "kb-lib.materializer.transaction",
"kb_pipeline", "kb_pipeline",
"kb_rpc", "kb_rpc",
"kb-store", "kb-store",
@@ -810,42 +810,42 @@
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_debug", "name": "file_kb_lib_materializer_transaction_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/devnet/kb_materializer_transaction_annotations/debug.log", "path": "logs/devnet/kb-lib/materializer/transaction/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_info", "name": "file_kb_lib_materializer_transaction_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/devnet/kb_materializer_transaction_annotations/info.log", "path": "logs/devnet/kb-lib/materializer/transaction/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_error", "name": "file_kb_lib_materializer_transaction_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/devnet/kb_materializer_transaction_annotations/error.jsonl", "path": "logs/devnet/kb-lib/materializer/transaction/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
@@ -1044,120 +1044,120 @@
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_debug", "name": "file_kb_lib_materializer_token_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/devnet/kb_materializer_token_accounts/debug.log", "path": "logs/devnet/kb-lib/materializer/token/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_info", "name": "file_kb_lib_materializer_token_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/devnet/kb_materializer_token_accounts/info.log", "path": "logs/devnet/kb-lib/materializer/token/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_error", "name": "file_kb_lib_materializer_token_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/devnet/kb_materializer_token_accounts/error.jsonl", "path": "logs/devnet/kb-lib/materializer/token/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_debug", "name": "file_kb_lib_materializer_risk_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/devnet/kb_materializer_risk/debug.log", "path": "logs/devnet/kb-lib/materializer/risk/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_info", "name": "file_kb_lib_materializer_risk_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/devnet/kb_materializer_risk/info.log", "path": "logs/devnet/kb-lib/materializer/risk/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_error", "name": "file_kb_lib_materializer_risk_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/devnet/kb_materializer_risk/error.jsonl", "path": "logs/devnet/kb-lib/materializer/risk/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_debug", "name": "file_kb_lib_decoder_spl_token2022_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/devnet/kb_lib_decoder_spl_token_2022/debug.log", "path": "logs/devnet/kb_lib_decoder_spl_token2022/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_info", "name": "file_kb_lib_decoder_spl_token2022_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/devnet/kb_lib_decoder_spl_token_2022/info.log", "path": "logs/devnet/kb_lib_decoder_spl_token2022/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_error", "name": "file_kb_lib_decoder_spl_token2022_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/devnet/kb_lib_decoder_spl_token_2022/error.jsonl", "path": "logs/devnet/kb_lib_decoder_spl_token2022/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
@@ -1317,42 +1317,42 @@
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_debug", "name": "file_kb_executor_spl_token2022_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/devnet/kb_executor_spl_token_2022/debug.log", "path": "logs/devnet/kb_executor_spl_token2022/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_info", "name": "file_kb_executor_spl_token2022_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/devnet/kb_executor_spl_token_2022/info.log", "path": "logs/devnet/kb_executor_spl_token2022/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_error", "name": "file_kb_executor_spl_token2022_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/devnet/kb_executor_spl_token_2022/error.jsonl", "path": "logs/devnet/kb_executor_spl_token2022/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
} }
], ],
@@ -1630,7 +1630,7 @@
"kb-lib.decoder.spl.elgamal_registry", "kb-lib.decoder.spl.elgamal_registry",
"kb-lib.decoder.spl.memo", "kb-lib.decoder.spl.memo",
"kb-lib.decoder.spl.token", "kb-lib.decoder.spl.token",
"kb-lib.decoder.spl.token_2022", "kb-lib.decoder.spl.token2022",
"kb_execution_solana", "kb_execution_solana",
"kb_executor_metadata_metaplex_token_metadata", "kb_executor_metadata_metaplex_token_metadata",
"kb_executor_metadata_spl_name_service", "kb_executor_metadata_spl_name_service",
@@ -1642,15 +1642,15 @@
"kb_executor_spl_noop", "kb_executor_spl_noop",
"kb_executor_spl_single_pool", "kb_executor_spl_single_pool",
"kb_executor_spl_token", "kb_executor_spl_token",
"kb_executor_spl_token_2022", "kb_executor_spl_token2022",
"kb-logging", "kb-logging",
"kb-lib.materializer.admin", "kb-lib.materializer.admin",
"kb-lib.materializer.compliance", "kb-lib.materializer.compliance",
"kb-lib.materializer.lifecycle", "kb-lib.materializer.lifecycle",
"kb_materializer_risk", "kb-lib.materializer.risk",
"kb-lib.materializer.staking", "kb-lib.materializer.staking",
"kb_materializer_token_accounts", "kb-lib.materializer.token",
"kb_materializer_transaction_annotations", "kb-lib.materializer.transaction",
"kb_pipeline", "kb_pipeline",
"kb_rpc", "kb_rpc",
"kb-store", "kb-store",
@@ -2412,42 +2412,42 @@
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_debug", "name": "file_kb_lib_materializer_transaction_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet_research/kb_materializer_transaction_annotations/debug.log", "path": "logs/mainnet_research/kb-lib/materializer/transaction/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_info", "name": "file_kb_lib_materializer_transaction_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet_research/kb_materializer_transaction_annotations/info.log", "path": "logs/mainnet_research/kb-lib/materializer/transaction/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_error", "name": "file_kb_lib_materializer_transaction_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet_research/kb_materializer_transaction_annotations/error.jsonl", "path": "logs/mainnet_research/kb-lib/materializer/transaction/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
@@ -2646,120 +2646,120 @@
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_debug", "name": "file_kb_lib_materializer_token_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet_research/kb_materializer_token_accounts/debug.log", "path": "logs/mainnet_research/kb-lib/materializer/token/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_info", "name": "file_kb_lib_materializer_token_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet_research/kb_materializer_token_accounts/info.log", "path": "logs/mainnet_research/kb-lib/materializer/token/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_error", "name": "file_kb_lib_materializer_token_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet_research/kb_materializer_token_accounts/error.jsonl", "path": "logs/mainnet_research/kb-lib/materializer/token/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_debug", "name": "file_kb_lib_materializer_risk_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet_research/kb_materializer_risk/debug.log", "path": "logs/mainnet_research/kb-lib/materializer/risk/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_info", "name": "file_kb_lib_materializer_risk_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet_research/kb_materializer_risk/info.log", "path": "logs/mainnet_research/kb-lib/materializer/risk/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_error", "name": "file_kb_lib_materializer_risk_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet_research/kb_materializer_risk/error.jsonl", "path": "logs/mainnet_research/kb-lib/materializer/risk/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_debug", "name": "file_kb_lib_decoder_spl_token2022_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet_research/kb_lib_decoder_spl_token_2022/debug.log", "path": "logs/mainnet_research/kb_lib_decoder_spl_token2022/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_info", "name": "file_kb_lib_decoder_spl_token2022_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet_research/kb_lib_decoder_spl_token_2022/info.log", "path": "logs/mainnet_research/kb_lib_decoder_spl_token2022/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_error", "name": "file_kb_lib_decoder_spl_token2022_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet_research/kb_lib_decoder_spl_token_2022/error.jsonl", "path": "logs/mainnet_research/kb_lib_decoder_spl_token2022/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
@@ -2919,42 +2919,42 @@
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_debug", "name": "file_kb_executor_spl_token2022_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet_research/kb_executor_spl_token_2022/debug.log", "path": "logs/mainnet_research/kb_executor_spl_token2022/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_info", "name": "file_kb_executor_spl_token2022_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet_research/kb_executor_spl_token_2022/info.log", "path": "logs/mainnet_research/kb_executor_spl_token2022/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_error", "name": "file_kb_executor_spl_token2022_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet_research/kb_executor_spl_token_2022/error.jsonl", "path": "logs/mainnet_research/kb_executor_spl_token2022/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
} }
], ],
@@ -3432,7 +3432,7 @@
"kb-lib.decoder.spl.elgamal_registry", "kb-lib.decoder.spl.elgamal_registry",
"kb-lib.decoder.spl.memo", "kb-lib.decoder.spl.memo",
"kb-lib.decoder.spl.token", "kb-lib.decoder.spl.token",
"kb-lib.decoder.spl.token_2022", "kb-lib.decoder.spl.token2022",
"kb_execution_solana", "kb_execution_solana",
"kb_executor_metadata_metaplex_token_metadata", "kb_executor_metadata_metaplex_token_metadata",
"kb_executor_metadata_spl_name_service", "kb_executor_metadata_spl_name_service",
@@ -3444,15 +3444,15 @@
"kb_executor_spl_noop", "kb_executor_spl_noop",
"kb_executor_spl_single_pool", "kb_executor_spl_single_pool",
"kb_executor_spl_token", "kb_executor_spl_token",
"kb_executor_spl_token_2022", "kb_executor_spl_token2022",
"kb-logging", "kb-logging",
"kb-lib.materializer.admin", "kb-lib.materializer.admin",
"kb-lib.materializer.compliance", "kb-lib.materializer.compliance",
"kb-lib.materializer.lifecycle", "kb-lib.materializer.lifecycle",
"kb_materializer_risk", "kb-lib.materializer.risk",
"kb-lib.materializer.staking", "kb-lib.materializer.staking",
"kb_materializer_token_accounts", "kb-lib.materializer.token",
"kb_materializer_transaction_annotations", "kb-lib.materializer.transaction",
"kb_pipeline", "kb_pipeline",
"kb_rpc", "kb_rpc",
"kb-store", "kb-store",
@@ -4214,42 +4214,42 @@
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_debug", "name": "file_kb_lib_materializer_transaction_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet/kb_materializer_transaction_annotations/debug.log", "path": "logs/mainnet/kb-lib/materializer/transaction/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_info", "name": "file_kb_lib_materializer_transaction_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet/kb_materializer_transaction_annotations/info.log", "path": "logs/mainnet/kb-lib/materializer/transaction/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
"name": "file_kb_materializer_transaction_annotations_error", "name": "file_kb_lib_materializer_transaction_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet/kb_materializer_transaction_annotations/error.jsonl", "path": "logs/mainnet/kb-lib/materializer/transaction/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_transaction_annotations" "kb-lib.materializer.transaction"
] ]
}, },
{ {
@@ -4448,120 +4448,120 @@
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_debug", "name": "file_kb_lib_materializer_token_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet/kb_materializer_token_accounts/debug.log", "path": "logs/mainnet/kb-lib/materializer/token/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_info", "name": "file_kb_lib_materializer_token_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet/kb_materializer_token_accounts/info.log", "path": "logs/mainnet/kb-lib/materializer/token/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_token_accounts_error", "name": "file_kb_lib_materializer_token_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet/kb_materializer_token_accounts/error.jsonl", "path": "logs/mainnet/kb-lib/materializer/token/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_token_accounts" "kb-lib.materializer.token"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_debug", "name": "file_kb_lib_materializer_risk_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet/kb_materializer_risk/debug.log", "path": "logs/mainnet/kb-lib/materializer/risk/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_info", "name": "file_kb_lib_materializer_risk_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet/kb_materializer_risk/info.log", "path": "logs/mainnet/kb-lib/materializer/risk/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_materializer_risk_error", "name": "file_kb_lib_materializer_risk_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet/kb_materializer_risk/error.jsonl", "path": "logs/mainnet/kb-lib/materializer/risk/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_materializer_risk" "kb-lib.materializer.risk"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_debug", "name": "file_kb_lib_decoder_spl_token2022_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet/kb_lib_decoder_spl_token_2022/debug.log", "path": "logs/mainnet/kb_lib_decoder_spl_token2022/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_info", "name": "file_kb_lib_decoder_spl_token2022_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet/kb_lib_decoder_spl_token_2022/info.log", "path": "logs/mainnet/kb_lib_decoder_spl_token2022/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
"name": "file_kb_lib_decoder_spl_token_2022_error", "name": "file_kb_lib_decoder_spl_token2022_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet/kb_lib_decoder_spl_token_2022/error.jsonl", "path": "logs/mainnet/kb_lib_decoder_spl_token2022/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb-lib.decoder.spl.token_2022" "kb-lib.decoder.spl.token2022"
] ]
}, },
{ {
@@ -4721,42 +4721,42 @@
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_debug", "name": "file_kb_executor_spl_token2022_debug",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "debug", "level": "debug",
"path": "logs/mainnet/kb_executor_spl_token_2022/debug.log", "path": "logs/mainnet/kb_executor_spl_token2022/debug.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_info", "name": "file_kb_executor_spl_token2022_info",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "info", "level": "info",
"path": "logs/mainnet/kb_executor_spl_token_2022/info.log", "path": "logs/mainnet/kb_executor_spl_token2022/info.log",
"rotation": "daily", "rotation": "daily",
"format": "human", "format": "human",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
}, },
{ {
"name": "file_kb_executor_spl_token_2022_error", "name": "file_kb_executor_spl_token2022_error",
"enabled": true, "enabled": true,
"sink": "file", "sink": "file",
"level": "error", "level": "error",
"path": "logs/mainnet/kb_executor_spl_token_2022/error.jsonl", "path": "logs/mainnet/kb_executor_spl_token2022/error.jsonl",
"rotation": "daily", "rotation": "daily",
"format": "json", "format": "json",
"ansi": false, "ansi": false,
"targets": [ "targets": [
"kb_executor_spl_token_2022" "kb_executor_spl_token2022"
] ]
} }
], ],

View File

@@ -1,5 +1,5 @@
<!-- file: docs/CORE_EXTRACTION_CONTRACTS.md --> <!-- file: docs/CORE_EXTRACTION_CONTRACTS.md -->
<!-- version: 5 --> <!-- version: 6 -->
# Contrats dextraction core Solana # Contrats dextraction core Solana
@@ -38,8 +38,8 @@ Lextraction refuse explicitement :
- un `canonical_json` absent ; - un `canonical_json` absent ;
- un `canonical_json_hash` absent ; - un `canonical_json_hash` absent ;
- une version différente de `CANONICAL_TRANSACTION_FORMAT_VERSION` ; - une version différente de `MD_CANONICAL_TRANSACTION_FORMAT_VERSION` ;
- un JSON non désérialisable en `CanonicalTransaction` ; - un JSON non désérialisable en `MdCanonicalTransaction` ;
- une signature ou un slot différent de la ligne raw ; - une signature ou un slot différent de la ligne raw ;
- un hash recalculé différent du hash stocké ; - un hash recalculé différent du hash stocké ;
- un indice de programme ou de compte hors de lespace résolu. - un indice de programme ou de compte hors de lespace résolu.

View File

@@ -15,7 +15,7 @@ Ce fichier sépare les identifiants primitifs Solana/SPL du registre des surface
## Table de contrôle ## Table de contrôle
| Canonique | Program ID | Source | Type | Crate cible | Statut | | Canonique | Program ID | Source | Type | Crate cible | Statut |
|--------------------------------------------|------------------------------------------------|-----------------------------------|----------------------|-------------------------------------------|-------------------------------------| |--------------------------------------------|------------------------------------------------|----------------------------------|----------------------|-------------------------------------------|-------------------------------------|
| `core_solana_address_lookup_table_v1` | `AddressLookupTab1e1111111111111111111111111` | `address_lookup_table` | `program` | `kb_decoder_solana_core` | `core_handled` | | `core_solana_address_lookup_table_v1` | `AddressLookupTab1e1111111111111111111111111` | `address_lookup_table` | `program` | `kb_decoder_solana_core` | `core_handled` |
| `core_solana_bpf_loader_deprecated_v1` | `BPFLoader1111111111111111111111111111111111` | `bpf_loader_deprecated` | `loader_program` | `kb_decoder_solana_core` | `core_handled` | | `core_solana_bpf_loader_deprecated_v1` | `BPFLoader1111111111111111111111111111111111` | `bpf_loader_deprecated` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
| `core_solana_bpf_loader_v2` | `BPFLoader2111111111111111111111111111111111` | `bpf_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` | | `core_solana_bpf_loader_v2` | `BPFLoader2111111111111111111111111111111111` | `bpf_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
@@ -58,6 +58,6 @@ Ce fichier sépare les identifiants primitifs Solana/SPL du registre des surface
| `core_spl_single_pool_v1` | `SVSPxpvHdN29nkVg9rPapPNDddN5DipNLRUFhyjFThE` | `spl_single_pool` | `program` | `kb_decoder_spl_single_pool` | `core_specialized_reserved_current` | | `core_spl_single_pool_v1` | `SVSPxpvHdN29nkVg9rPapPNDddN5DipNLRUFhyjFThE` | `spl_single_pool` | `program` | `kb_decoder_spl_single_pool` | `core_specialized_reserved_current` |
| `core_spl_name_service_v1` | `namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX` | `spl_name_service` | `program` | `kb_decoder_metadata_spl_name_service` | `core_specialized_reserved_current` | | `core_spl_name_service_v1` | `namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX` | `spl_name_service` | `program` | `kb_decoder_metadata_spl_name_service` | `core_specialized_reserved_current` |
| `core_spl_stake_pool_v1` | `SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy` | `stake_pool` | `program` | `kb_decoder_spl_stake_pool` | `core_specialized_reserved_current` | | `core_spl_stake_pool_v1` | `SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy` | `stake_pool` | `program` | `kb_decoder_spl_stake_pool` | `core_specialized_reserved_current` |
| `core_spl_token_2022_v2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `token_2022` | `program` | `kb_decoder_spl_token_2022` | `core_handled` | | `core_spl_token_2022_v2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `token2022` | `program` | `kb_decoder_spl_token_2022` | `core_handled` |
| `core_spl_token_2022_elgamal_registry_v1` | `regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg` | `spl_token_2022_elgamal_registry` | `program` | `kb_decoder_spl_token_2022` | `core_specialized_reserved_current` | | `core_spl_token_2022_elgamal_registry_v1` | `regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg` | `spl_token2022_elgamal_registry` | `program` | `kb_decoder_spl_token_2022` | `core_specialized_reserved_current` |
| `core_spl_token_v1` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | `token` | `program` | `kb_decoder_spl_token` | `core_handled` | | `core_spl_token_v1` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | `token` | `program` | `kb_decoder_spl_token` | `core_handled` |

View File

@@ -20,7 +20,7 @@ core instruction contextualisée
## Input contextualisé ## Input contextualisé
`CoreInstructionReplayInput` reste lunique contrat dentrée commun. Son contrat passe à la version `2` dans `0.4.1-pre.014`. Il contient la signature, le slot, le statut et lerreur on-chain, le chemin stable de linstruction, le program ID, les comptes résolus dans leur ordre original, le payload brut déterministe et son hash, toutes les instructions outer ordonnées par index numérique, les inner instructions descendantes, les logs reliés prudemment, les changements de balances et la version du contrat core. `MdCoreInstructionReplayInput` reste lunique contrat dentrée commun. Son contrat passe à la version `2` dans `0.4.1-pre.014`. Il contient la signature, le slot, le statut et lerreur on-chain, le chemin stable de linstruction, le program ID, les comptes résolus dans leur ordre original, le payload brut déterministe et son hash, toutes les instructions outer ordonnées par index numérique, les inner instructions descendantes, les logs reliés prudemment, les changements de balances et la version du contrat core.
`outer_instructions_json` est un tableau stable dont chaque entrée contient `instructionIndex`, `instructionPath`, `programId`, `payloadJson` et `payloadHash`. Linstruction cible est incluse. Cette projection provient des tables core existantes et ne nécessite aucune migration SQL. `outer_instructions_json` est un tableau stable dont chaque entrée contient `instructionIndex`, `instructionPath`, `programId`, `payloadJson` et `payloadHash`. Linstruction cible est incluse. Cette projection provient des tables core existantes et ne nécessite aucune migration SQL.
@@ -30,7 +30,7 @@ Le passage au contrat `2` modifie légitimement les hashes existants, car les pa
## Contrat de décodeur ## Contrat de décodeur
`InstructionDecoder` expose : `DcApiInstructionDecoder` expose :
- une identité stable `name/version` ; - une identité stable `name/version` ;
- les programmes et surfaces supportés ; - les programmes et surfaces supportés ;
@@ -58,7 +58,7 @@ observation_committed
`observation_committed` doit être faux lorsque la transaction a été annulée. Ces observations peuvent décrire une instruction tentée, un événement loggé avant lerreur, une classification déchec, une consommation de compute ou une surface appelée. `observation_committed` doit être faux lorsque la transaction a été annulée. Ces observations peuvent décrire une instruction tentée, un événement loggé avant lerreur, une classification déchec, une consommation de compute ou une surface appelée.
Elles ne peuvent pas produire automatiquement un trade réussi, une modification de liquidité réussie, un changement confirmé de catalogue ou une candle normale. `EventMaterializer` applique une politique explicite par famille. Les familles `trade`, `liquidity` et `lifecycle` sont refusées avant lappel au matérialiseur lorsque la source est échouée ou non commitée. Une seconde barrière valide ensuite les familles de sortie et nautorise, dans ce contexte, que les matérialisations daudit ou de risque. Elles ne peuvent pas produire automatiquement un trade réussi, une modification de liquidité réussie, un changement confirmé de catalogue ou une candle normale. `MtApiEventMaterializer` applique une politique explicite par famille. Les familles `trade`, `liquidity` et `lifecycle` sont refusées avant lappel au matérialiseur lorsque la source est échouée ou non commitée. Une seconde barrière valide ensuite les familles de sortie et nautorise, dans ce contexte, que les matérialisations daudit ou de risque.
## Persistance ## Persistance

View File

@@ -77,11 +77,11 @@ Le genesis hash sert à classifier les clusters publics connus. Le réseau de pr
La simulation accepte une transaction base64 non signée lorsque `sigVerify = false`; `replaceRecentBlockhash = true` permet au nœud de remplacer le blockhash avant simulation. Les erreurs runtime restent un résultat de simulation typé et ne sont pas confondues avec une erreur HTTP ou JSON-RPC. La simulation accepte une transaction base64 non signée lorsque `sigVerify = false`; `replaceRecentBlockhash = true` permet au nœud de remplacer le blockhash avant simulation. Les erreurs runtime restent un résultat de simulation typé et ne sont pas confondues avec une erreur HTTP ou JSON-RPC.
`kb_rpc` ne fabrique pas le contexte de sécurité : cluster attendu, âge du blockhash, nonce account et nonce authority sont fournis explicitement lors de la conversion vers `ExecutionSimulationResult`. Depuis `pre.013`, `getAccountInfo` possède aussi un mode données complètes borné : le mode metadata-only conserve `dataSlice.length = 0`, tandis que `confirmed_with_data(max_data_bytes)` exige un tuple base64 complet dont la longueur décodée égale `space`. `kb_rpc` ne fabrique pas le contexte de sécurité : cluster attendu, âge du blockhash, nonce account et nonce authority sont fournis explicitement lors de la conversion vers `ExApiExecutionSimulationResult`. Depuis `pre.013`, `getAccountInfo` possède aussi un mode données complètes borné : le mode metadata-only conserve `dataSlice.length = 0`, tandis que `confirmed_with_data(max_data_bytes)` exige un tuple base64 complet dont la longueur décodée égale `space`.
## Assemblage et signature Solana ## Assemblage et signature Solana
`0.4.2-pre.005` introduit `kb_execution_solana`, frontière commune entre les exécuteurs et les adaptateurs RPC. La crate convertit les `PlannedInstruction` en instructions SDK, compile le message avec son fee payer et sa source de blockhash, puis vérifie que les signataires réellement compilés correspondent exactement au contrat du plan. `0.4.2-pre.005` introduit `kb_execution_solana`, frontière commune entre les exécuteurs et les adaptateurs RPC. La crate convertit les `ExApiPlannedInstruction` en instructions SDK, compile le message avec son fee payer et sa source de blockhash, puis vérifie que les signataires réellement compilés correspondent exactement au contrat du plan.
La transaction non signée fournit deux sorties distinctes : La transaction non signée fournit deux sorties distinctes :

View File

@@ -50,7 +50,7 @@ Certains protocoles Solana exigent de lire :
- des séquences de logs liées à un CPI ; - des séquences de logs liées à un CPI ;
- des instructions voisines de la même transaction. - des instructions voisines de la même transaction.
`CoreInstructionReplayInput` représente ce contrat de lecture : une instruction ciblée plus un contexte extrait depuis les tables `core`. Depuis le contrat `2`, ce contexte inclut également toutes les instructions outer de la signature, ordonnées numériquement et munies de leur payload retenu et de son hash. `MdCoreInstructionReplayInput` représente ce contrat de lecture : une instruction ciblée plus un contexte extrait depuis les tables `core`. Depuis le contrat `2`, ce contexte inclut également toutes les instructions outer de la signature, ordonnées numériquement et munies de leur payload retenu et de son hash.
## Sélection de replay ## Sélection de replay
@@ -68,7 +68,7 @@ program_id = programme ciblé par le décodeur
plage de slots = optionnelle plage de slots = optionnelle
``` ```
Le repository charge les logs, balances, account keys et instructions outer nécessaires pour retourner `CoreInstructionReplayInput`. La liste outer inclut la cible et utilise les champs stables `instructionIndex`, `instructionPath`, `programId`, `payloadJson` et `payloadHash`. Cette extension lit les tables existantes et ne demande aucune migration. Le repository charge les logs, balances, account keys et instructions outer nécessaires pour retourner `MdCoreInstructionReplayInput`. La liste outer inclut la cible et utilise les champs stables `instructionIndex`, `instructionPath`, `programId`, `payloadJson` et `payloadHash`. Cette extension lit les tables existantes et ne demande aucune migration.
## Marquage de cycle de vie ## Marquage de cycle de vie

View File

@@ -1,5 +1,5 @@
<!-- file: docs/MATERIALIZATIONS.md --> <!-- file: docs/MATERIALIZATIONS.md -->
<!-- version: 7 --> <!-- version: 8 -->
# Catalogue des matérialisations # Catalogue des matérialisations
@@ -36,16 +36,26 @@ La famille décodée n'impose pas à elle seule la famille matérialisée. `auth
`kb_lib::AdminMaterializer` produit des sorties `Admin` pour les assignations System, les écritures Config opaques et les changements dautorité Loader. `kb_lib::ComplianceAuditMaterializer` produit des sorties `ComplianceAudit` pour les écritures/copies de bytecode Loader. `kb_lib::StakingMaterializer` produit les projections instructionnelles Stake/Vote commitées : comptes stake/vote, autorités, lockup, délégation, vote state, retraits et dépôt de rewards. Les données complètes ne sont jamais recopiées : seules les clés, autorités, offsets, tailles, hashes, préfixes et paramètres bornés disponibles sont conservés. `kb_lib::AdminMaterializer` produit des sorties `Admin` pour les assignations System, les écritures Config opaques et les changements dautorité Loader. `kb_lib::ComplianceAuditMaterializer` produit des sorties `ComplianceAudit` pour les écritures/copies de bytecode Loader. `kb_lib::StakingMaterializer` produit les projections instructionnelles Stake/Vote commitées : comptes stake/vote, autorités, lockup, délégation, vote state, retraits et dépôt de rewards. Les données complètes ne sont jamais recopiées : seules les clés, autorités, offsets, tailles, hashes, préfixes et paramètres bornés disponibles sont conservés.
Les quatre implémentations résident respectivement dans `kb_lib::materializer::lifecycle`, `admin`, `compliance` et `staking`, mais sont réexportées à la racine de `kb-lib`. Les identités de processor historiques restent stables pour les replays ; les targets de tracing utilisent la hiérarchie consolidée `kb-lib.materializer.*`. Les implémentations résident dans des modules privés et sont réexportées uniquement à la racine de `kb-lib`. Les identités de processor historiques restent stables pour les replays ; les targets de tracing utilisent la hiérarchie consolidée `kb-lib.materializer.*`.
Le retrait d'un nonce account conserve une sémantique conditionnelle : le runtime ferme le compte uniquement lorsque la totalité du solde est retirée. La projection décrit l'opération commitée et ne prétend pas reconstruire l'état final transactionnel du compte. Les deltas SOL restent la responsabilité du graphe core. Le retrait d'un nonce account conserve une sémantique conditionnelle : le runtime ferme le compte uniquement lorsque la totalité du solde est retirée. La projection décrit l'opération commitée et ne prétend pas reconstruire l'état final transactionnel du compte. Les deltas SOL restent la responsabilité du graphe core.
Une preuve ZK n'est jamais matérialisée. Seul le lifecycle du compte de contexte est projeté lorsqu'il existe. Un rapport Slashing conserve le signal de violation et son lifecycle, mais pas le contenu du compte de preuve externe ; `penaltyAppliedByProgram` reste faux car le programme ne retire pas lui-même du stake. L'ancien ZK Token Proof Program reste en decode/audit, car le runtime actuel est sans effet et aucun historique mainnet fiable n'a été observé. Une preuve ZK n'est jamais matérialisée. Seul le lifecycle du compte de contexte est projeté lorsqu'il existe. Un rapport Slashing conserve le signal de violation et son lifecycle, mais pas le contenu du compte de preuve externe ; `penaltyAppliedByProgram` reste faux car le programme ne retire pas lui-même du stake. L'ancien ZK Token Proof Program reste en decode/audit, car le runtime actuel est sans effet et aucun historique mainnet fiable n'a été observé.
## Projections SPL et Metaplex portées
- `MtTransactionAnnotationMaterializer` accepte uniquement les observations Memo exactes, réussies et commitées, puis produit une annotation idempotente bornée avec texte, hash, génération et signataires vérifiés.
- `MtTokenAccountsMaterializer` projette les mutations SPL Token classique et Token2022, possède le lifecycle ATA et peut produire un snapshot borné Mint/Account/Multisig Token2022 à partir de létat parsé.
- `MtFeesMaterializer` projette les instructions et snapshots de frais Token2022 publics ou confidentiels. Les blobs confidentiels restent opaques et `confidentialValuesDecrypted` demeure faux.
- `MtRiskMaterializer` produit uniquement des faits structurels SPL Token/ATA : délégation, freeze/thaw, autorités révoquées, multisig faible et récupération dATA imbriquée. Aucun score arbitraire nest inventé.
- `MtMetadataMaterializer` projette les metadata incorporées Token2022 et les comptes Metaplex canoniques, avec provenance et lifecycle explicites. `externalUriFetched` reste faux.
Le registre ElGamal ne possède pas un matérialiseur autonome : ses snapshots administratifs sont la responsabilité de `MtAdminMaterializer`. Le fetch HTTP/IPFS/Arweave des URI est off-chain et reste réservé à une future crate dédiée.
## Matérialisations spécialisées à prévoir ## Matérialisations spécialisées à prévoir
- `nft` : NFT classiques, programmables et compressés. - `nft` : NFT classiques, programmables et compressés.
- `metadata` : metadata Metaplex, creators, collection, update authority, URI et symbol. - `metadata` avancée : fetch off-chain borné, réconciliation de provenance et historique des changements.
- `oracle` : prix, publisher, confidence, staleness et sources d'oracle. - `oracle` : prix, publisher, confidence, staleness et sources d'oracle.
- `lending` : borrow, repay, collateral, liquidation et health factor. - `lending` : borrow, repay, collateral, liquidation et health factor.
- `staking` avancé : snapshots de comptes Stake/Vote avant/après, activation par epoch, crédits Vote cumulés et réconciliation avec sysvars. - `staking` avancé : snapshots de comptes Stake/Vote avant/après, activation par epoch, crédits Vote cumulés et réconciliation avec sysvars.

View File

@@ -313,7 +313,7 @@
], ],
"provenance_boundaries": [ "provenance_boundaries": [
"metaplex_token_metadata", "metaplex_token_metadata",
"token_2022_embedded_metadata", "token2022_embedded_metadata",
"metaplex_core", "metaplex_core",
"metaplex_bubblegum" "metaplex_bubblegum"
], ],

View File

@@ -12,20 +12,20 @@ Les sorties ne sont pas des snapshots finaux de comptes ou de runtime. Les état
## Projections actives par matérialiseur ## Projections actives par matérialiseur
| Matérialiseur | Surfaces | Projection | | Matérialiseur | Surfaces | Projection |
|------------------------------------|----------------------|---------------------------------------------------------------------------------------------------------------------| |---------------------------------|----------------------|---------------------------------------------------------------------------------------------------------------------|
| `LifecycleMaterializer` | Address Lookup Table | lifecycle create/freeze/extend/deactivate/close | | `MtLifecycleMaterializer` | Address Lookup Table | lifecycle create/freeze/extend/deactivate/close |
| `LifecycleMaterializer` | Feature | révocation de feature gate | | `MtLifecycleMaterializer` | Feature | révocation de feature gate |
| `LifecycleMaterializer` | Loaders | déploiement, finalisation et transitions lifecycle stables | | `MtLifecycleMaterializer` | Loaders | déploiement, finalisation et transitions lifecycle stables |
| `LifecycleMaterializer` | System | durable nonce, create account et allocate | | `MtLifecycleMaterializer` | System | durable nonce, create account et allocate |
| `LifecycleMaterializer` | ZK ElGamal | création ou fermeture dun compte de contexte | | `MtLifecycleMaterializer` | ZK ElGamal | création ou fermeture dun compte de contexte |
| `LifecycleMaterializer` | Slashing | initialisation ou fermeture dun rapport de violation | | `MtLifecycleMaterializer` | Slashing | initialisation ou fermeture dun rapport de violation |
| `AdminMaterializer` | System | assign et assign with seed | | `MtAdminMaterializer` | System | assign et assign with seed |
| `AdminMaterializer` | Config | écriture opaque bornée avec clés, taille, SHA-256 et préfixe | | `MtAdminMaterializer` | Config | écriture opaque bornée avec clés, taille, SHA-256 et préfixe |
| `AdminMaterializer` | Loaders | changements dautorité | | `MtAdminMaterializer` | Loaders | changements dautorité |
| `ComplianceAuditMaterializer` | Loaders | écritures/copies de bytecode bornées par offsets, tailles, SHA-256 et préfixes | | `MtComplianceAuditMaterializer` | Loaders | écritures/copies de bytecode bornées par offsets, tailles, SHA-256 et préfixes |
| `ComplianceAuditMaterializer` | Compute Budget | profil transactionnel agrégé, last-write-wins, une seule sortie par transaction | | `MtComplianceAuditMaterializer` | Compute Budget | profil transactionnel agrégé, last-write-wins, une seule sortie par transaction |
| `StakingMaterializer` | Stake | compte, délégation, désactivation, split, merge, withdraw, move stake/lamports, autorités et lockup instructionnels | | `MtStakingMaterializer` | Stake | compte, délégation, désactivation, split, merge, withdraw, move stake/lamports, autorités et lockup instructionnels |
| `StakingMaterializer` | Vote | compte, autorités, identité, commission, vote state, retraits et dépôt de rewards instructionnels | | `MtStakingMaterializer` | Vote | compte, autorités, identité, commission, vote state, retraits et dépôt de rewards instructionnels |
## Politique des transactions échouées ## Politique des transactions échouées

View File

@@ -55,7 +55,7 @@ Nouvelle règle :
Ces identifiants sont détaillés dans `docs/CORE_PROGRAM_IDS.md`. Ils sont couverts par les décodeurs core/primitifs ou par des crates spécialisées SPL futures, pas par une crate DEX dédiée. Ces identifiants sont détaillés dans `docs/CORE_PROGRAM_IDS.md`. Ils sont couverts par les décodeurs core/primitifs ou par des crates spécialisées SPL futures, pas par une crate DEX dédiée.
| Canonique | Program ID | Source | Type | Crate cible | Statut | | Canonique | Program ID | Source | Type | Crate cible | Statut |
|--------------------------------------------|------------------------------------------------|-----------------------------------|----------------------|-------------------------------------------|-------------------------------------| |--------------------------------------------|------------------------------------------------|----------------------------------|----------------------|-------------------------------------------|-------------------------------------|
| `core_solana_address_lookup_table_v1` | `AddressLookupTab1e1111111111111111111111111` | `address_lookup_table` | `program` | `kb_decoder_solana_core` | `core_handled` | | `core_solana_address_lookup_table_v1` | `AddressLookupTab1e1111111111111111111111111` | `address_lookup_table` | `program` | `kb_decoder_solana_core` | `core_handled` |
| `core_solana_bpf_loader_deprecated_v1` | `BPFLoader1111111111111111111111111111111111` | `bpf_loader_deprecated` | `loader_program` | `kb_decoder_solana_core` | `core_handled` | | `core_solana_bpf_loader_deprecated_v1` | `BPFLoader1111111111111111111111111111111111` | `bpf_loader_deprecated` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
| `core_solana_bpf_loader_v2` | `BPFLoader2111111111111111111111111111111111` | `bpf_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` | | `core_solana_bpf_loader_v2` | `BPFLoader2111111111111111111111111111111111` | `bpf_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
@@ -97,8 +97,8 @@ Ces identifiants sont détaillés dans `docs/CORE_PROGRAM_IDS.md`. Ils sont couv
| `core_spl_single_pool_v1` | `SVSPxpvHdN29nkVg9rPapPNDddN5DipNLRUFhyjFThE` | `spl_single_pool` | `program` | `kb_decoder_spl_single_pool` | `core_specialized_reserved_current` | | `core_spl_single_pool_v1` | `SVSPxpvHdN29nkVg9rPapPNDddN5DipNLRUFhyjFThE` | `spl_single_pool` | `program` | `kb_decoder_spl_single_pool` | `core_specialized_reserved_current` |
| `core_spl_name_service_v1` | `namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX` | `spl_name_service` | `program` | `kb_decoder_metadata_spl_name_service` | `core_specialized_reserved_current` | | `core_spl_name_service_v1` | `namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX` | `spl_name_service` | `program` | `kb_decoder_metadata_spl_name_service` | `core_specialized_reserved_current` |
| `core_spl_stake_pool_v1` | `SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy` | `stake_pool` | `program` | `kb_decoder_spl_stake_pool` | `core_specialized_reserved_current` | | `core_spl_stake_pool_v1` | `SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy` | `stake_pool` | `program` | `kb_decoder_spl_stake_pool` | `core_specialized_reserved_current` |
| `core_spl_token_2022_v2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `token_2022` | `program` | `kb_decoder_spl_token_2022` | `core_handled` | | `core_spl_token_2022_v2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `token2022` | `program` | `kb_decoder_spl_token_2022` | `core_handled` |
| `core_spl_token_2022_elgamal_registry_v1` | `regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg` | `spl_token_2022_elgamal_registry` | `program` | `kb_decoder_spl_token_2022` | `core_specialized_reserved_current` | | `core_spl_token_2022_elgamal_registry_v1` | `regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg` | `spl_token2022_elgamal_registry` | `program` | `kb_decoder_spl_token_2022` | `core_specialized_reserved_current` |
| `core_spl_token_v1` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | `token` | `program` | `kb_decoder_spl_token` | `core_handled` | | `core_spl_token_v1` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | `token` | `program` | `kb_decoder_spl_token` | `core_handled` |
@@ -246,7 +246,7 @@ Ces identifiants sont détaillés dans `docs/CORE_PROGRAM_IDS.md`. Ils sont couv
## NFT, metadata, admin, governance et locks ## NFT, metadata, admin, governance et locks
| Canonique | Program ID | Source | Normalisé | Crate actuelle | Crate cible | Statut | | Canonique | Program ID | Source | Normalisé | Crate actuelle | Crate cible | Statut |
|------------------------------------|------------------------------------------------|---------------------------|---------------------------|------------------------|-----------------------------------------------|--------------------| |------------------------------------|------------------------------------------------|---------------------------|---------------------------|------------------------|------------------------------------------------------|--------------------|
| `lock_raydium_lp` | `LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE` | `raydium_lock_lp` | `raydium_lock_lp` | `-` | `kb_decoder_lock_raydium_lp` | `reserved_missing` | | `lock_raydium_lp` | `LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE` | `raydium_lock_lp` | `raydium_lock_lp` | `-` | `kb_decoder_lock_raydium_lp` | `reserved_missing` |
| `admin_jupiter_lock` | `LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn` | `jupiter_lock` | `jupiter_lock` | `-` | `kb_decoder_admin_jupiter_lock` | `reserved_missing` | | `admin_jupiter_lock` | `LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn` | `jupiter_lock` | `jupiter_lock` | `-` | `kb_decoder_admin_jupiter_lock` | `reserved_missing` |
| `admin_pump_fees` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | `pump_fees` | `pump_fees` | `kb_decoder_pump_fees` | `kb_decoder_admin_pump_fees` | `current_alias` | | `admin_pump_fees` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | `pump_fees` | `pump_fees` | `kb_decoder_pump_fees` | `kb_decoder_admin_pump_fees` | `current_alias` |

View File

@@ -229,7 +229,7 @@ La mise en conformité est découpée avant toute nouvelle prérelease :
1. `pre.035-delta-fix-002` : séparation des règles et audit automatisé reproductible ; 1. `pre.035-delta-fix-002` : séparation des règles et audit automatisé reproductible ;
2. correctifs suivants : points d'entrée de crates, réexports `pub`/`pub(crate)`, rustdocs et chemins `crate::...` ; 2. correctifs suivants : points d'entrée de crates, réexports `pub`/`pub(crate)`, rustdocs et chemins `crate::...` ;
3. correctifs suivants : imports de traits et suppression des imports ordinaires/groupés ; 3. correctifs suivants : imports de traits et suppression des imports ordinaires/groupés ;
4. correctifs suivants : `TRACING_TARGET`, dépendances `tracing`, macros et matrice de routes ; 4. correctifs suivants : `DC_METADATA_MTM_TRACING_TARGET`, dépendances `tracing`, macros et matrice de routes ;
5. correctifs suivants : helpers dupliqués et mutualisation inter-crates ; 5. correctifs suivants : helpers dupliqués et mutualisation inter-crates ;
6. fermeture : `cargo fmt --all`, audit strict, tests workspace et Clippy global. 6. fermeture : `cargo fmt --all`, audit strict, tests workspace et Clippy global.

View File

@@ -71,7 +71,7 @@ Le message à signer provient de `solana_transaction::Transaction::message_data(
## Identifiants natifs, Vote et loaders dans lexécuteur ## Identifiants natifs, Vote et loaders dans lexécuteur
`solana-sdk-ids` est conservé intentionnellement comme registre officiel modulaire des adresses natives et sysvars. Les chemins `solana_sdk_ids::sysvar::{clock,rent,slot_hashes,instructions}` ne constituent pas un retour au SDK monolithique : ils fournissent uniquement des `Pubkey` canoniques. `solana-instructions-sysvar` ne doit être ajouté que lorsquune crate appelle réellement ses fonctions dintrospection dinstructions, pas pour remplacer un simple ID officiel. `solana-sdk-ids` est conservé intentionnellement comme registre officiel modulaire des adresses natives et sysvars. Les chemins `solana_sdk_ids::sysvar::{clock,rent,slot_hashes,instructions}` ne constituent pas un retour au SDK monolithique : ils fournissent uniquement des `MdPubkey` canoniques. `solana-instructions-sysvar` ne doit être ajouté que lorsquune crate appelle réellement ses fonctions dintrospection dinstructions, pas pour remplacer un simple ID officiel.
`kb_executor_solana_core` consomme `solana-vote-interface ^6.0` avec `serde` et `wincode` pour construire les vingt variantes wire Vote actuelles. Il utilise `solana-instruction` pour `Instruction`/`AccountMeta`, `solana-pubkey::Pubkey` pour les adresses publiques, `solana-hash::Hash` pour les hashes et `solana-sdk-ids` pour Rent, Clock et SlotHashes. Les quatre créations composées utilisent `solana-system-interface`; aucune dépendance `solana-sdk` ni feature `bincode` nest ajoutée à la crate. `kb_executor_solana_core` consomme `solana-vote-interface ^6.0` avec `serde` et `wincode` pour construire les vingt variantes wire Vote actuelles. Il utilise `solana-instruction` pour `Instruction`/`AccountMeta`, `solana-pubkey::Pubkey` pour les adresses publiques, `solana-hash::Hash` pour les hashes et `solana-sdk-ids` pour Rent, Clock et SlotHashes. Les quatre créations composées utilisent `solana-system-interface`; aucune dépendance `solana-sdk` ni feature `bincode` nest ajoutée à la crate.
@@ -214,7 +214,7 @@ longueurs de chaînes de `Initialize`, `UpdateField` et `RemoveKey`. Cette garde
normative pour le décodeur ; `UpdateAuthority` et `Emit` restent sans chaîne. normative pour le décodeur ; `UpdateAuthority` et `Emit` restent sans chaîne.
La migration `0.1.0-pre.008` conserve ces contrats dans La migration `0.1.0-pre.008` conserve ces contrats dans
`kb_lib::decoder::spl::token_2022` et isole le registre dans `kb_lib::decoder::spl::token2022` et isole le registre dans
`kb_lib::decoder::spl::elgamal_registry`. Les targets de tracing, matrices et Program IDs restent `kb_lib::decoder::spl::elgamal_registry`. Les targets de tracing, matrices et Program IDs restent
distincts ; aucun pointeur TLV nest interprété comme une preuve de létat du programme externe distincts ; aucun pointeur TLV nest interprété comme une preuve de létat du programme externe
pointé. pointé.

View File

@@ -1,13 +1,17 @@
{ {
"file": "docs/SPL_ASSOCIATED_TOKEN_ACCOUNT_MATRIX.json", "file": "docs/SPL_ASSOCIATED_TOKEN_ACCOUNT_MATRIX.json",
"version": 10, "version": 11,
"schemaVersion": 1, "schemaVersion": 1,
"bot3Migration": { "bot3Migration": {
"target": "kb-lib.decoder.spl.associated_token_account", "target": "kb-lib.decoder.spl.associated_token_account",
"status": "ported_pending_operator_cargo_validation", "status": "decoder_operator_validated_materializers_ported",
"prerelease": "0.1.0-pre.007", "prerelease": "0.1.0-pre.007",
"preservedDifferentialTests": 10, "preservedDifferentialTests": 10,
"materializerPorted": false, "materializerPorted": true,
"publicMaterializers": [
"kb_lib::TokenAccountsMaterializer",
"kb_lib::RiskMaterializer"
],
"executorPorted": false, "executorPorted": false,
"pipelinePorted": false "pipelinePorted": false
}, },
@@ -15,7 +19,7 @@
"systemProgramId": "11111111111111111111111111111111", "systemProgramId": "11111111111111111111111111111111",
"supportedTokenPrograms": [ "supportedTokenPrograms": [
{"code": "spl_token", "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", "scope": "classic_token_account_lifecycle_only"}, {"code": "spl_token", "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", "scope": "classic_token_account_lifecycle_only"},
{"code": "spl_token_2022", "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", "scope": "ata_lifecycle_only_without_general_token_2022_instruction_or_extension_decode"} {"code": "spl_token2022", "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", "scope": "ata_lifecycle_only_without_general_token2022_instruction_or_extension_decode"}
], ],
"interface": { "interface": {
"workspaceConstraint": "^2.0", "workspaceConstraint": "^2.0",
@@ -85,10 +89,10 @@
"runtimeRules": ["fails if the associated account already exists", "funding account pays rent and creation cost", "mint and created account must be coherent with the selected token program"], "runtimeRules": ["fails if the associated account already exists", "funding account pays rent and creation cost", "mint and created account must be coherent with the selected token program"],
"event": "spl_associated_token_account.create", "event": "spl_associated_token_account.create",
"authorizedProjections": ["token_accounts:ata_created"], "authorizedProjections": ["token_accounts:ata_created"],
"forbiddenProjections": ["token_balance_snapshot", "duplicate_spl_token_initialize_account_cpi", "token_2022_extension_fact"], "forbiddenProjections": ["token_balance_snapshot", "duplicate_spl_token_initialize_account_cpi", "token2022_extension_fact"],
"officialBuilder": {"available": true, "function": "create_associated_token_account", "canonicalWireOnly": true}, "officialBuilder": {"available": true, "function": "create_associated_token_account", "canonicalWireOnly": true},
"executorSupport": {"status": "supported", "operationCode": "spl_associated_token_account.create", "builder": "create_associated_token_account", "simulation": "required", "defaultMode": "dry_run"}, "executorSupport": {"status": "supported", "operationCode": "spl_associated_token_account.create", "builder": "create_associated_token_account", "simulation": "required", "defaultMode": "dry_run"},
"proofs": {"synthetic": ["canonical_00", "legacy_empty", "classic_token_program", "token_2022_program", "wrong_ata", "missing_account", "extra_account", "duplicate_account", "wrong_flags", "unknown_suffix", "outer", "inner_cpi", "committed", "failed_intent"], "localnet": "not_tested", "devnet": "not_tested", "mainnetSignatures": []} "proofs": {"synthetic": ["canonical_00", "legacy_empty", "classic_token_program", "token2022_program", "wrong_ata", "missing_account", "extra_account", "duplicate_account", "wrong_flags", "unknown_suffix", "outer", "inner_cpi", "committed", "failed_intent"], "localnet": "not_tested", "devnet": "not_tested", "mainnetSignatures": []}
}, },
{ {
"name": "create_idempotent", "name": "create_idempotent",
@@ -109,10 +113,10 @@
"runtimeRules": ["creates when absent", "succeeds without recreating when an initialized compatible ATA already exists", "fails when an existing account has a different wallet owner, mint or account owner program"], "runtimeRules": ["creates when absent", "succeeds without recreating when an initialized compatible ATA already exists", "fails when an existing account has a different wallet owner, mint or account owner program"],
"event": "spl_associated_token_account.create_idempotent", "event": "spl_associated_token_account.create_idempotent",
"authorizedProjections": ["token_accounts:ata_created_or_reused_idempotently"], "authorizedProjections": ["token_accounts:ata_created_or_reused_idempotently"],
"forbiddenProjections": ["token_balance_snapshot", "duplicate_spl_token_initialize_account_cpi", "token_2022_extension_fact"], "forbiddenProjections": ["token_balance_snapshot", "duplicate_spl_token_initialize_account_cpi", "token2022_extension_fact"],
"officialBuilder": {"available": true, "function": "create_associated_token_account_idempotent", "canonicalWireOnly": true}, "officialBuilder": {"available": true, "function": "create_associated_token_account_idempotent", "canonicalWireOnly": true},
"executorSupport": {"status": "supported", "operationCode": "spl_associated_token_account.create_idempotent", "builder": "create_associated_token_account_idempotent", "simulation": "required", "defaultMode": "dry_run"}, "executorSupport": {"status": "supported", "operationCode": "spl_associated_token_account.create_idempotent", "builder": "create_associated_token_account_idempotent", "simulation": "required", "defaultMode": "dry_run"},
"proofs": {"synthetic": ["canonical_01", "absent_account", "compatible_existing_account", "conflicting_existing_owner", "conflicting_existing_mint", "conflicting_existing_program", "classic_token_program", "token_2022_program", "wrong_ata", "wrong_flags", "unexpected_suffix", "outer", "inner_cpi", "committed", "failed_intent"], "localnet": "not_tested", "devnet": ["5Vw4QFpMa8oJ8MsLrvDg4RFzxqUh27mTFRFzzwJFoA4uAry8rZQc6GP92aidzWugn3CeZ5NYNxDp7tZ6bh8XyN1P", "2H9VfhDySdXMteazm2P3s2fTttJBQzMJinQtKqsLtkjDg7zbFFgiWG81UxRQF4va3bbR2pUV4QGo2qErisR8CPbP", "3wWTkx45LoDR3UaU8VUfsWxwHuLFyJyhrnDrmijCa7pXPdmJKz3rQ1LdyDvb78dvNRiKqw5ee7HuZ6Gjj1Gpfv6q", "bMMjoHcwbaTvLXerdQ4kbGXGb7wydiTyvSEwwmoKKLQcRWWBzqGUMYHZztonNnER1iWZ7yKp9p3neeMhypX4QAJ", "4RZKA3KwEbSqgU8UnemTgvd3fBgJmoSK2nmaaTNP8nJGTVh6DrFwrHVZYCBvLFvhvzUdi9p1KRFe4hHqYt7JbVSG"], "mainnetSignatures": ["2F9RvuCkevfJN7ju252hAWoCE58wagCXCWHQF9Wsdtsxvp3HcuNJQFCwU7zGqe3z3b8pv3vPp4xY5EH7KLcaHQCY"], "realCorpusStatus": "controlled classic and Token-2022 CreateIdempotent creation then compatible-existing reuse confirmed, materialized once per signature and replayed idempotently; search-discovered Token-2022 outer transaction remains additional corpus"} "proofs": {"synthetic": ["canonical_01", "absent_account", "compatible_existing_account", "conflicting_existing_owner", "conflicting_existing_mint", "conflicting_existing_program", "classic_token_program", "token2022_program", "wrong_ata", "wrong_flags", "unexpected_suffix", "outer", "inner_cpi", "committed", "failed_intent"], "localnet": "not_tested", "devnet": ["5Vw4QFpMa8oJ8MsLrvDg4RFzxqUh27mTFRFzzwJFoA4uAry8rZQc6GP92aidzWugn3CeZ5NYNxDp7tZ6bh8XyN1P", "2H9VfhDySdXMteazm2P3s2fTttJBQzMJinQtKqsLtkjDg7zbFFgiWG81UxRQF4va3bbR2pUV4QGo2qErisR8CPbP", "3wWTkx45LoDR3UaU8VUfsWxwHuLFyJyhrnDrmijCa7pXPdmJKz3rQ1LdyDvb78dvNRiKqw5ee7HuZ6Gjj1Gpfv6q", "bMMjoHcwbaTvLXerdQ4kbGXGb7wydiTyvSEwwmoKKLQcRWWBzqGUMYHZztonNnER1iWZ7yKp9p3neeMhypX4QAJ", "4RZKA3KwEbSqgU8UnemTgvd3fBgJmoSK2nmaaTNP8nJGTVh6DrFwrHVZYCBvLFvhvzUdi9p1KRFe4hHqYt7JbVSG"], "mainnetSignatures": ["2F9RvuCkevfJN7ju252hAWoCE58wagCXCWHQF9Wsdtsxvp3HcuNJQFCwU7zGqe3z3b8pv3vPp4xY5EH7KLcaHQCY"], "realCorpusStatus": "controlled classic and Token-2022 CreateIdempotent creation then compatible-existing reuse confirmed, materialized once per signature and replayed idempotently; search-discovered Token-2022 outer transaction remains additional corpus"}
}, },
{ {
"name": "recover_nested", "name": "recover_nested",
@@ -134,16 +138,16 @@
"runtimeRules": ["all three derived addresses must match their observed accounts", "owner and nested token accounts must be initialized and coherent with their respective mints", "wallet owner must sign", "complete nested token balance is moved to the wallet destination ATA", "nested account is closed and its lamports are returned to the wallet"], "runtimeRules": ["all three derived addresses must match their observed accounts", "owner and nested token accounts must be initialized and coherent with their respective mints", "wallet owner must sign", "complete nested token balance is moved to the wallet destination ATA", "nested account is closed and its lamports are returned to the wallet"],
"event": "spl_associated_token_account.recover_nested", "event": "spl_associated_token_account.recover_nested",
"authorizedProjections": ["token_accounts:nested_ata_recovered", "risk:nested_ata_anti_pattern_recovered"], "authorizedProjections": ["token_accounts:nested_ata_recovered", "risk:nested_ata_anti_pattern_recovered"],
"forbiddenProjections": ["duplicate_spl_token_transfer_cpi", "duplicate_spl_token_close_account_cpi", "token_balance_snapshot", "token_2022_extension_fact"], "forbiddenProjections": ["duplicate_spl_token_transfer_cpi", "duplicate_spl_token_close_account_cpi", "token_balance_snapshot", "token2022_extension_fact"],
"officialBuilder": {"available": true, "function": "recover_nested", "canonicalWireOnly": true}, "officialBuilder": {"available": true, "function": "recover_nested", "canonicalWireOnly": true},
"executorSupport": {"status": "supported", "operationCode": "spl_associated_token_account.recover_nested", "builder": "recover_nested", "simulation": "required", "defaultMode": "dry_run"}, "executorSupport": {"status": "supported", "operationCode": "spl_associated_token_account.recover_nested", "builder": "recover_nested", "simulation": "required", "defaultMode": "dry_run"},
"proofs": {"synthetic": ["canonical_02", "classic_token_program", "token_2022_program", "valid_three_pda_relationships", "wrong_nested_ata", "wrong_destination_ata", "wrong_owner_ata", "owner_and_nested_mints_not_inverted", "missing_account", "extra_account", "duplicate_account", "wrong_flags", "unexpected_suffix", "outer", "inner_cpi", "committed", "failed_intent"], "localnet": "not_tested", "devnet": ["37LG6GdMRp5ECG8qf1RSYxmriJk75UtCwqwzXZWpArebkKo6BQvGhYEnbDh2A6KWiUaHK28Zy1gGGZ5zihvrHskM"], "mainnetSignatures": [], "realCorpusStatus": "controlled classic RecoverNested confirmed with positive raw balance transfer, nested ATA closure, owner and destination post-validation, two distinct ATA lifecycle and risk projections, and idempotent second replay", "controlledDevnetFixture": {"walletOwner": "DwuAapPLg6pEJ4QhmxvPg8rzkavmYdg5FW4dfEMcg8B2", "ownerMint": "So11111111111111111111111111111111111111112", "ownerAssociatedTokenAccount": "3tdXq1W7vEbbkxQmT1r2fc349uYti98zpwLKhp7FFbF5", "nestedMint": "3fd5CqP1w4Y1xeMoAe3apA7Jf5SbL3vboxv7ihyXhC9A", "nestedAssociatedTokenAccount": "AAyvGeKpq6i3kxMcScJLcN2u5iyAsspr731LhgXygti5", "walletNestedMintAssociatedTokenAccount": "69TP2QoSx2inueFAEb6npjumH5o3wGJQDSwwAJLLfyWp", "rawAmountTransferred": "1000000000", "nestedAccountClosed": true, "destinationUiBalanceAfter": "1", "materializedOutputCount": 2}} "proofs": {"synthetic": ["canonical_02", "classic_token_program", "token2022_program", "valid_three_pda_relationships", "wrong_nested_ata", "wrong_destination_ata", "wrong_owner_ata", "owner_and_nested_mints_not_inverted", "missing_account", "extra_account", "duplicate_account", "wrong_flags", "unexpected_suffix", "outer", "inner_cpi", "committed", "failed_intent"], "localnet": "not_tested", "devnet": ["37LG6GdMRp5ECG8qf1RSYxmriJk75UtCwqwzXZWpArebkKo6BQvGhYEnbDh2A6KWiUaHK28Zy1gGGZ5zihvrHskM"], "mainnetSignatures": [], "realCorpusStatus": "controlled classic RecoverNested confirmed with positive raw balance transfer, nested ATA closure, owner and destination post-validation, two distinct ATA lifecycle and risk projections, and idempotent second replay", "controlledDevnetFixture": {"walletOwner": "DwuAapPLg6pEJ4QhmxvPg8rzkavmYdg5FW4dfEMcg8B2", "ownerMint": "So11111111111111111111111111111111111111112", "ownerAssociatedTokenAccount": "3tdXq1W7vEbbkxQmT1r2fc349uYti98zpwLKhp7FFbF5", "nestedMint": "3fd5CqP1w4Y1xeMoAe3apA7Jf5SbL3vboxv7ihyXhC9A", "nestedAssociatedTokenAccount": "AAyvGeKpq6i3kxMcScJLcN2u5iyAsspr731LhgXygti5", "walletNestedMintAssociatedTokenAccount": "69TP2QoSx2inueFAEb6npjumH5o3wGJQDSwwAJLLfyWp", "rawAmountTransferred": "1000000000", "nestedAccountClosed": true, "destinationUiBalanceAfter": "1", "materializedOutputCount": 2}}
} }
], ],
"offlineCorpus": { "offlineCorpus": {
"status": "implemented_and_operator_validated_in_decoder_unit_tests", "status": "implemented_and_operator_validated_in_decoder_unit_tests",
"wire": ["create_00", "legacy_empty_create", "create_idempotent_01", "recover_nested_02", "unknown_tag", "rejected_suffix"], "wire": ["create_00", "legacy_empty_create", "create_idempotent_01", "recover_nested_02", "unknown_tag", "rejected_suffix"],
"tokenPrograms": ["spl_token_classic", "token_2022"], "tokenPrograms": ["spl_token_classic", "token2022"],
"locations": ["outer", "inner_cpi"], "locations": ["outer", "inner_cpi"],
"transactionOutcomes": ["committed", "failed_uncommitted_intent"], "transactionOutcomes": ["committed", "failed_uncommitted_intent"],
"accountShapes": ["canonical", "missing", "extra", "duplicate", "wrong_flags", "wrong_derived_address", "unsupported_token_program", "wrong_system_program"], "accountShapes": ["canonical", "missing", "extra", "duplicate", "wrong_flags", "wrong_derived_address", "unsupported_token_program", "wrong_system_program"],
@@ -155,7 +159,8 @@
"idempotenceIdentity": "signature + instruction_path + program_id + normalized_operation + ata", "idempotenceIdentity": "signature + instruction_path + program_id + normalized_operation + ata",
"projectionOwners": [ "projectionOwners": [
{ {
"crate": "kb_materializer_token_accounts", "crate": "kb-lib",
"component": "materializer.token.accounts",
"facts": [ "facts": [
"ata_created", "ata_created",
"ata_created_or_reused_idempotently", "ata_created_or_reused_idempotently",
@@ -164,7 +169,8 @@
"justification": "ATA creation and recovery are stable token-account lifecycle facts; this crate already owns instruction-level token-account mutations." "justification": "ATA creation and recovery are stable token-account lifecycle facts; this crate already owns instruction-level token-account mutations."
}, },
{ {
"crate": "kb_materializer_risk", "crate": "kb-lib",
"component": "materializer.risk",
"facts": [ "facts": [
"nested_ata_anti_pattern_recovered" "nested_ata_anti_pattern_recovered"
], ],
@@ -173,15 +179,18 @@
], ],
"explicitNoProjection": [ "explicitNoProjection": [
{ {
"crate": "kb_materializer_lifecycle", "crate": "kb-lib",
"reason": "Native program lifecycle remains owned here; duplicating ATA lifecycle would overlap kb_materializer_token_accounts." "component": "materializer.lifecycle",
"reason": "Native program lifecycle remains owned here; duplicating ATA lifecycle would overlap the token-account materializer."
}, },
{ {
"crate": "kb_materializer_admin", "crate": "kb-lib",
"component": "materializer.admin",
"reason": "ATA instructions do not change a mint authority, freeze authority, close authority or multisig configuration." "reason": "ATA instructions do not change a mint authority, freeze authority, close authority or multisig configuration."
}, },
{ {
"crate": "kb_materializer_fees", "crate": "kb-lib",
"component": "materializer.fees",
"reason": "ATA wire does not prove an exact rent or network-fee amount; core balance changes and execution validation retain those facts." "reason": "ATA wire does not prove an exact rent or network-fee amount; core balance changes and execution validation retain those facts."
} }
], ],
@@ -195,7 +204,7 @@
"deploymentAudit": { "deploymentAudit": {
"localnet": {"status": "not_tested", "evidence": []}, "localnet": {"status": "not_tested", "evidence": []},
"devnet": {"status": "classic and Token-2022 CreateIdempotent creation and compatible-existing reuse confirmed; classic RecoverNested positive-balance recovery confirmed", "evidence": ["5Vw4QFpMa8oJ8MsLrvDg4RFzxqUh27mTFRFzzwJFoA4uAry8rZQc6GP92aidzWugn3CeZ5NYNxDp7tZ6bh8XyN1P", "2H9VfhDySdXMteazm2P3s2fTttJBQzMJinQtKqsLtkjDg7zbFFgiWG81UxRQF4va3bbR2pUV4QGo2qErisR8CPbP", "3wWTkx45LoDR3UaU8VUfsWxwHuLFyJyhrnDrmijCa7pXPdmJKz3rQ1LdyDvb78dvNRiKqw5ee7HuZ6Gjj1Gpfv6q", "bMMjoHcwbaTvLXerdQ4kbGXGb7wydiTyvSEwwmoKKLQcRWWBzqGUMYHZztonNnER1iWZ7yKp9p3neeMhypX4QAJ", "4RZKA3KwEbSqgU8UnemTgvd3fBgJmoSK2nmaaTNP8nJGTVh6DrFwrHVZYCBvLFvhvzUdi9p1KRFe4hHqYt7JbVSG", "37LG6GdMRp5ECG8qf1RSYxmriJk75UtCwqwzXZWpArebkKo6BQvGhYEnbDh2A6KWiUaHK28Zy1gGGZ5zihvrHskM"], "controlledToken2022Fixture": {"mint": "3DxKAUfCZkR9oRfMXeRNpiVL464eKbTieymBrVhsoKTE", "mintOwner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", "mintBaseLength": 82, "walletOwner": "DwuAapPLg6pEJ4QhmxvPg8rzkavmYdg5FW4dfEMcg8B2", "associatedTokenAccount": "6WfCJPt7GZQyMJAUS1AMHJrD7Vid8e9xUEQVgi5Q9C9Y", "accountLength": 170, "accountExtension": "immutable_owner", "creationSlot": 476702448, "existingReuseSlot": 476703343}}, "devnet": {"status": "classic and Token-2022 CreateIdempotent creation and compatible-existing reuse confirmed; classic RecoverNested positive-balance recovery confirmed", "evidence": ["5Vw4QFpMa8oJ8MsLrvDg4RFzxqUh27mTFRFzzwJFoA4uAry8rZQc6GP92aidzWugn3CeZ5NYNxDp7tZ6bh8XyN1P", "2H9VfhDySdXMteazm2P3s2fTttJBQzMJinQtKqsLtkjDg7zbFFgiWG81UxRQF4va3bbR2pUV4QGo2qErisR8CPbP", "3wWTkx45LoDR3UaU8VUfsWxwHuLFyJyhrnDrmijCa7pXPdmJKz3rQ1LdyDvb78dvNRiKqw5ee7HuZ6Gjj1Gpfv6q", "bMMjoHcwbaTvLXerdQ4kbGXGb7wydiTyvSEwwmoKKLQcRWWBzqGUMYHZztonNnER1iWZ7yKp9p3neeMhypX4QAJ", "4RZKA3KwEbSqgU8UnemTgvd3fBgJmoSK2nmaaTNP8nJGTVh6DrFwrHVZYCBvLFvhvzUdi9p1KRFe4hHqYt7JbVSG", "37LG6GdMRp5ECG8qf1RSYxmriJk75UtCwqwzXZWpArebkKo6BQvGhYEnbDh2A6KWiUaHK28Zy1gGGZ5zihvrHskM"], "controlledToken2022Fixture": {"mint": "3DxKAUfCZkR9oRfMXeRNpiVL464eKbTieymBrVhsoKTE", "mintOwner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", "mintBaseLength": 82, "walletOwner": "DwuAapPLg6pEJ4QhmxvPg8rzkavmYdg5FW4dfEMcg8B2", "associatedTokenAccount": "6WfCJPt7GZQyMJAUS1AMHJrD7Vid8e9xUEQVgi5Q9C9Y", "accountLength": 170, "accountExtension": "immutable_owner", "creationSlot": 476702448, "existingReuseSlot": 476703343}},
"mainnet": {"status": "search_discovered_token_2022_create_idempotent_not_yet_replayed", "evidence": ["2F9RvuCkevfJN7ju252hAWoCE58wagCXCWHQF9Wsdtsxvp3HcuNJQFCwU7zGqe3z3b8pv3vPp4xY5EH7KLcaHQCY"]}, "mainnet": {"status": "search_discovered_token2022_create_idempotent_not_yet_replayed", "evidence": ["2F9RvuCkevfJN7ju252hAWoCE58wagCXCWHQF9Wsdtsxvp3HcuNJQFCwU7zGqe3z3b8pv3vPp4xY5EH7KLcaHQCY"]},
"rateLimitRecovery": "preserve confirmed signatures and resume bounded hydration; never recreate accounts blindly after HTTP 429" "rateLimitRecovery": "preserve confirmed signatures and resume bounded hydration; never recreate accounts blindly after HTTP 429"
}, },
"nonClaims": [ "nonClaims": [

View File

@@ -1,13 +1,14 @@
{ {
"file": "docs/SPL_MEMO_MATRIX.json", "file": "docs/SPL_MEMO_MATRIX.json",
"version": 9, "version": 10,
"matrixVersion": 4, "matrixVersion": 4,
"scope": "SPL Memo v1, v3 et v4", "scope": "SPL Memo v1, v3 et v4",
"bot3Migration": { "bot3Migration": {
"decoderModule": "kb_lib::decoder::spl::memo", "decoderModule": "kb_lib::decoder::spl::memo",
"publicDecoder": "kb_lib::SplMemoDecoder", "publicDecoder": "kb_lib::SplMemoDecoder",
"decoderStatus": "ported_in_0.1.0-pre.005", "decoderStatus": "ported_in_0.1.0-pre.005",
"materializerStatus": "pending_later_tranche", "publicMaterializer": "kb_lib::TransactionAnnotationMaterializer",
"materializerStatus": "ported_in_0.1.0-pre.011",
"executorStatus": "pending_later_tranche" "executorStatus": "pending_later_tranche"
}, },
"interface": { "interface": {
@@ -113,7 +114,8 @@
"unknownProgramProducesObservation": false "unknownProgramProducesObservation": false
}, },
"materializationContract": { "materializationContract": {
"crate": "kb_materializer_transaction_annotations", "crate": "kb-lib",
"component": "materializer.transaction.annotations",
"processorName": "transaction_annotations", "processorName": "transaction_annotations",
"materializedFamily": "transaction_annotation", "materializedFamily": "transaction_annotation",
"acceptedEntries": ["add_memo", "memo_intent", "invalid_memo_attempt"], "acceptedEntries": ["add_memo", "memo_intent", "invalid_memo_attempt"],

View File

@@ -1,4 +1,4 @@
<!-- file: docs/SPL_TOKEN_2022_CONFIDENTIAL_EXECUTION_AUDIT.md --> <!-- file: docs/SPL_TOKEN2022_CONFIDENTIAL_EXECUTION_AUDIT.md -->
<!-- version: 6 --> <!-- version: 6 -->
# Audit dexécution Confidential Transfer Token-2022 # Audit dexécution Confidential Transfer Token-2022

View File

@@ -1,5 +1,5 @@
{ {
"file": "docs/SPL_TOKEN_2022_MATRIX.json", "file": "docs/SPL_TOKEN2022_MATRIX.json",
"version": "0.1.0-pre.008", "version": "0.1.0-pre.008",
"schemaVersion": 1, "schemaVersion": 1,
"matrixStatus": "exact_decoder_leaf_coverage_proven_pending_materialization_executor_preflight_and_cluster_corpus_completion", "matrixStatus": "exact_decoder_leaf_coverage_proven_pending_materialization_executor_preflight_and_cluster_corpus_completion",
@@ -30,7 +30,7 @@
"default", "default",
"serde" "serde"
], ],
"leafConsumer": "kb-lib.decoder.spl.token_2022", "leafConsumer": "kb-lib.decoder.spl.token2022",
"operatorEvidence": "cargo tree -i spl-token-2022-interface -e features", "operatorEvidence": "cargo tree -i spl-token-2022-interface -e features",
"publishedCandidateAudited": "3.1.1", "publishedCandidateAudited": "3.1.1",
"publishedCandidateStatus": "matches_confirmed_workspace_resolution", "publishedCandidateStatus": "matches_confirmed_workspace_resolution",
@@ -2060,7 +2060,7 @@
"stable_fact_only_no_score" "stable_fact_only_no_score"
], ],
"lifecycle": [ "lifecycle": [
"no_token_2022_claim_until_non_overlap_is_proven" "no_token2022_claim_until_non_overlap_is_proven"
] ]
}, },
"forbiddenClaims": [ "forbiddenClaims": [

View File

@@ -1,4 +1,4 @@
<!-- file: docs/SPL_TOKEN_2022_SOURCE_AUDIT.md --> <!-- file: docs/SPL_TOKEN2022_SOURCE_AUDIT.md -->
<!-- version: 6 --> <!-- version: 6 -->
# Audit des sources Token-2022 résolues # Audit des sources Token-2022 résolues

View File

@@ -39,7 +39,7 @@
] ]
}, },
{ {
"id": "token_2022_public_devnet", "id": "token2022_public_devnet",
"environment": "devnet", "environment": "devnet",
"status": "not_run", "status": "not_run",
"requiredEvidence": [ "requiredEvidence": [

View File

@@ -1,5 +1,5 @@
<!-- file: docs/TRACING_CONTRACT.md --> <!-- file: docs/TRACING_CONTRACT.md -->
<!-- version: 19 --> <!-- version: 20 -->
# Contrat de tracing par crate et composant # Contrat de tracing par crate et composant
@@ -62,11 +62,14 @@ kb-lib.decoder.spl.associated_token_account
kb-lib.decoder.spl.elgamal_registry kb-lib.decoder.spl.elgamal_registry
kb-lib.decoder.spl.memo kb-lib.decoder.spl.memo
kb-lib.decoder.spl.token kb-lib.decoder.spl.token
kb-lib.decoder.spl.token_2022 kb-lib.decoder.spl.token2022
kb-lib.materializer.admin kb-lib.materializer.admin
kb-lib.materializer.compliance kb-lib.materializer.compliance
kb-lib.materializer.lifecycle kb-lib.materializer.lifecycle
kb-lib.materializer.risk
kb-lib.materializer.staking kb-lib.materializer.staking
kb-lib.materializer.token
kb-lib.materializer.transaction
kb-logging kb-logging
kb-store kb-store
``` ```

View File

@@ -35,7 +35,7 @@ Validation du jalon de cadrage stockage : conventions PostgreSQL définies autou
## 0.2.1 — contrats `kb_store_core` et replay instruction-level ## 0.2.1 — contrats `kb_store_core` et replay instruction-level
Validation du jalon de contrats storage : `kb_store_core` expose les types communs backend-agnostiques pour pagination, healthcheck, migrations, erreurs de stockage, DTOs applicatifs, entities proches SQL et traits repositories sans implémentation PostgreSQL. Les contrats couvrent le raw RPC et WebSocket, le cycle de vie raw `Full` / `Compacted` / `Archived` / `Purged`, les états de traitement raw, la signature optionnelle des notifications WebSocket, la déduplication par `notification_key`, le lien futur optionnel notification vers transaction canonique, ainsi que le replay par instruction. Le replay est défini comme un scheduling au niveau instruction, mais le décodage reçoit un contexte extrait complet via `CoreInstructionReplayInput` : instruction ciblée, account keys, logs, balance changes et contexte transactionnel minimal. Les repositories restent abstraits et ne créent encore ni pool PostgreSQL, ni migration SQL réelle. Validation locale effectuée : `cargo test -p kb_store_core` avec 28 tests passés et `cargo clippy --all-targets` sans avertissement. Les validations précédentes du jalon ont également confirmé `kb_store_pg` sans test actif, `kb_config` avec 35 tests passés et `kb_app_demo` avec 28 tests passés. Validation du jalon de contrats storage : `kb_store_core` expose les types communs backend-agnostiques pour pagination, healthcheck, migrations, erreurs de stockage, DTOs applicatifs, entities proches SQL et traits repositories sans implémentation PostgreSQL. Les contrats couvrent le raw RPC et WebSocket, le cycle de vie raw `Full` / `Compacted` / `Archived` / `Purged`, les états de traitement raw, la signature optionnelle des notifications WebSocket, la déduplication par `notification_key`, le lien futur optionnel notification vers transaction canonique, ainsi que le replay par instruction. Le replay est défini comme un scheduling au niveau instruction, mais le décodage reçoit un contexte extrait complet via `MdCoreInstructionReplayInput` : instruction ciblée, account keys, logs, balance changes et contexte transactionnel minimal. Les repositories restent abstraits et ne créent encore ni pool PostgreSQL, ni migration SQL réelle. Validation locale effectuée : `cargo test -p kb_store_core` avec 28 tests passés et `cargo clippy --all-targets` sans avertissement. Les validations précédentes du jalon ont également confirmé `kb_store_pg` sans test actif, `kb_config` avec 35 tests passés et `kb_app_demo` avec 28 tests passés.
## 0.2.2 — infrastructure PostgreSQL minimale ## 0.2.2 — infrastructure PostgreSQL minimale
@@ -47,7 +47,7 @@ Validation du jalon raw store minimal : `kb_store_pg` crée et initialise les de
## 0.2.4 — core Solana normalisé minimal ## 0.2.4 — core Solana normalisé minimal
Validation du jalon core store minimal : `kb_store_pg` crée et initialise maintenant les tables core `kb_sol_core_transactions`, `kb_sol_core_account_keys`, `kb_sol_core_instructions`, `kb_sol_core_inner_instructions`, `kb_sol_core_logs` et `kb_sol_core_balance_changes`, en complément du raw store `0.2.3`, sans schema PostgreSQL applicatif explicite. Les migrations et l'initializer utilisent des noms SQL préfixés et explicites pour les contraintes et index : `pk_`, `fk_`, `ck_`, `ux_` et `ix_`. L'initialisation raw/core est sérialisée par un verrou PostgreSQL `pg_advisory_xact_lock` afin d'éviter les courses concurrentes pendant les tests ou les démarrages parallèles. `CoreTransactionStore` dispose de l'implémentation PostgreSQL minimale pour insérer les transactions core, account keys, instructions, inner instructions, logs et deltas de balances, puis reconstruire `CoreInstructionReplayInput` pour les futurs décodeurs. Le script de maintenance `kb_store_pg/maintenance/drop_raw_core_store.sql` permet de réinitialiser explicitement les tables raw/core locales dans l'ordre inverse des dépendances. Validation locale effectuée : `KB_POSTGRES_TEST_URL=postgres://solana:solana@localhost:5432/solana cargo test -p kb_store_pg -- --nocapture` avec 30 tests passés, création vérifiée des 8 tables dans PostgreSQL, réinitialisation validée via le script de maintenance, puis `cargo clippy --all-targets` sans avertissement. Le worker d'extraction raw RPC vers core, les observations et le ledger ops sont conservés pour les jalons suivants. Validation du jalon core store minimal : `kb_store_pg` crée et initialise maintenant les tables core `kb_sol_core_transactions`, `kb_sol_core_account_keys`, `kb_sol_core_instructions`, `kb_sol_core_inner_instructions`, `kb_sol_core_logs` et `kb_sol_core_balance_changes`, en complément du raw store `0.2.3`, sans schema PostgreSQL applicatif explicite. Les migrations et l'initializer utilisent des noms SQL préfixés et explicites pour les contraintes et index : `pk_`, `fk_`, `ck_`, `ux_` et `ix_`. L'initialisation raw/core est sérialisée par un verrou PostgreSQL `pg_advisory_xact_lock` afin d'éviter les courses concurrentes pendant les tests ou les démarrages parallèles. `CoreTransactionStore` dispose de l'implémentation PostgreSQL minimale pour insérer les transactions core, account keys, instructions, inner instructions, logs et deltas de balances, puis reconstruire `MdCoreInstructionReplayInput` pour les futurs décodeurs. Le script de maintenance `kb_store_pg/maintenance/drop_raw_core_store.sql` permet de réinitialiser explicitement les tables raw/core locales dans l'ordre inverse des dépendances. Validation locale effectuée : `KB_POSTGRES_TEST_URL=postgres://solana:solana@localhost:5432/solana cargo test -p kb_store_pg -- --nocapture` avec 30 tests passés, création vérifiée des 8 tables dans PostgreSQL, réinitialisation validée via le script de maintenance, puis `cargo clippy --all-targets` sans avertissement. Le worker d'extraction raw RPC vers core, les observations et le ledger ops sont conservés pour les jalons suivants.
## 0.2.5 — diagnostics SQL PostgreSQL dans `kb_app_demo` ## 0.2.5 — diagnostics SQL PostgreSQL dans `kb_app_demo`

View File

@@ -172,7 +172,7 @@ Ce fichier contient les changements futurs et le phasage prévu. Il ne remplace
- [x] Ajouter les types communs : pagination, tri, limites, healthcheck, statut migration. - [x] Ajouter les types communs : pagination, tri, limites, healthcheck, statut migration.
- [x] Ajouter les premiers DTO génériques : raw RPC transaction, raw WS notification, core transaction, core instruction. - [x] Ajouter les premiers DTO génériques : raw RPC transaction, raw WS notification, core transaction, core instruction.
- [x] Ajouter les contrats core pour account keys, logs et balance changes extraits. - [x] Ajouter les contrats core pour account keys, logs et balance changes extraits.
- [x] Ajouter `CoreInstructionReplayInput` pour fournir aux décodeurs une instruction avec contexte extrait. - [x] Ajouter `MdCoreInstructionReplayInput` pour fournir aux décodeurs une instruction avec contexte extrait.
- [x] Ajouter les contrats de cycle de vie raw : état de rétention, état de traitement et mark lifecycle. - [x] Ajouter les contrats de cycle de vie raw : état de rétention, état de traitement et mark lifecycle.
- [x] Ajouter les contrats de replay par instruction : état instruction, filtre de replay et lifecycle mark. - [x] Ajouter les contrats de replay par instruction : état instruction, filtre de replay et lifecycle mark.
- [x] Ajouter les premiers traits repository sans implémentation SQL. - [x] Ajouter les premiers traits repository sans implémentation SQL.
@@ -229,7 +229,7 @@ Ce fichier contient les changements futurs et le phasage prévu. Il ne remplace
### 0.2.4 — core Solana normalisé minimal ### 0.2.4 — core Solana normalisé minimal
- [x] Créer les tables core minimales : `kb_sol_core_transactions`, `kb_sol_core_account_keys`, `kb_sol_core_instructions`, `kb_sol_core_inner_instructions`, `kb_sol_core_logs`, `kb_sol_core_balance_changes`. - [x] Créer les tables core minimales : `kb_sol_core_transactions`, `kb_sol_core_account_keys`, `kb_sol_core_instructions`, `kb_sol_core_inner_instructions`, `kb_sol_core_logs`, `kb_sol_core_balance_changes`.
- [x] Construire `CoreInstructionReplayInput` depuis les tables `core` pour les décodeurs. - [x] Construire `MdCoreInstructionReplayInput` depuis les tables `core` pour les décodeurs.
- [x] Marquer les instructions insérées comme `Pending` pour permettre un replay instruction-level. - [x] Marquer les instructions insérées comme `Pending` pour permettre un replay instruction-level.
- [x] Préparer le replay partiel par état, slot et program id via `CoreInstructionReplayFilter`. - [x] Préparer le replay partiel par état, slot et program id via `CoreInstructionReplayFilter`.
- [x] Ajouter une initialisation idempotente raw/core via `PostgresStore::initialize_store_schema()`. - [x] Ajouter une initialisation idempotente raw/core via `PostgresStore::initialize_store_schema()`.
@@ -460,7 +460,7 @@ Les contrôles autrefois prévus dans `0.3.5` sont reclassés ainsi : la stabili
- [x] Auditer les crates utilisant `tracing.workspace = true` et couvrir les treize crates alors actives par un test de constante canonique et par les routes des trois profils. - [x] Auditer les crates utilisant `tracing.workspace = true` et couvrir les treize crates alors actives par un test de constante canonique et par les routes des trois profils.
- [x] Ajouter le tracing propriétaire manquant sur les clients/pools HTTP et WebSocket ainsi que sur le backfill ; promouvoir les inputs decode unmatched, statuts failed/unsupported et échecs de matérialisation/persistance au niveau `error`. - [x] Ajouter le tracing propriétaire manquant sur les clients/pools HTTP et WebSocket ainsi que sur le backfill ; promouvoir les inputs decode unmatched, statuts failed/unsupported et échecs de matérialisation/persistance au niveau `error`.
- [x] Formaliser dans `docs/SOLANA_INTERFACE_DEPENDENCIES.md` la politique dinterfaces officielles : dépendance seulement au point de consommation, priorité `wincode` puis Borsh, parser borné lorsque linterface nexpose que `bincode`. - [x] Formaliser dans `docs/SOLANA_INTERFACE_DEPENDENCIES.md` la politique dinterfaces officielles : dépendance seulement au point de consommation, priorité `wincode` puis Borsh, parser borné lorsque linterface nexpose que `bincode`.
- [x] Passer `CoreInstructionReplayInput` au contrat `2` avec une liste stable et numériquement ordonnée des instructions outer, sans migration SQL, afin de résoudre les références inter-instructions des précompiles. - [x] Passer `MdCoreInstructionReplayInput` au contrat `2` avec une liste stable et numériquement ordonnée des instructions outer, sans migration SQL, afin de résoudre les références inter-instructions des précompiles.
- [x] Décoder `zk_elgamal_proof` dans `pre.015` selon `solana-zk-elgamal-proof-interface ^0.1` et le runtime Agave : treize discriminants, preuves inline ou référencées par compte, contexte optionnel et fermeture du contexte, sans recalcul cryptographique. - [x] Décoder `zk_elgamal_proof` dans `pre.015` selon `solana-zk-elgamal-proof-interface ^0.1` et le runtime Agave : treize discriminants, preuves inline ou référencées par compte, contexte optionnel et fermeture du contexte, sans recalcul cryptographique.
- [x] Décoder dans `pre.016` lancien `zk_token_proof` comme compatibilité historique, puis retirer dans `pre.019` la dépendance dépréciée `solana-zk-token-sdk` au profit dun miroir wire local borné des dix-sept discriminants et tailles auditées. - [x] Décoder dans `pre.016` lancien `zk_token_proof` comme compatibilité historique, puis retirer dans `pre.019` la dépendance dépréciée `solana-zk-token-sdk` au profit dun miroir wire local borné des dix-sept discriminants et tailles auditées.
- [x] Décoder les loaders `native_loader`, `bpf_loader_deprecated`, `bpf_loader`, `bpf_loader_upgradeable` et `loader_v4` ; classer linvocation Native Loader opaque comme `ignored` sans sémantique inventée. - [x] Décoder les loaders `native_loader`, `bpf_loader_deprecated`, `bpf_loader`, `bpf_loader_upgradeable` et `loader_v4` ; classer linvocation Native Loader opaque comme `ignored` sans sémantique inventée.
@@ -532,14 +532,14 @@ Les contrôles autrefois prévus dans `0.3.5` sont reclassés ainsi : la stabili
#### Suite dorchestration #### Suite dorchestration
- [x] `pre.004` : ajouter dans `kb_rpc` les adaptateurs typés `getGenesisHash`, `getLatestBlockhash`, `getFeeForMessage` et `simulateTransaction`, avec routage par rôle, classification des clusters publics, diagnostics runtime et conversion vers `ExecutionSimulationResult`, sans signature ni envoi. - [x] `pre.004` : ajouter dans `kb_rpc` les adaptateurs typés `getGenesisHash`, `getLatestBlockhash`, `getFeeForMessage` et `simulateTransaction`, avec routage par rôle, classification des clusters publics, diagnostics runtime et conversion vers `ExApiExecutionSimulationResult`, sans signature ni envoi.
- [x] `pre.004` : documenter dans `kb_executor_solana_core/README.md` chaque fonction publique, les six opérations constructibles, leurs paramètres, résultats, effets et frontières. - [x] `pre.004` : documenter dans `kb_executor_solana_core/README.md` chaque fonction publique, les six opérations constructibles, leurs paramètres, résultats, effets et frontières.
- [x] Valider localement `pre.004` : `kb_rpc` 63 tests, `kb_execution_api` 21 tests, `kb_execution_safety` 13 tests, `kb_executor_solana_core` 10 tests, `kb_config` 40 tests et Clippy global propre. - [x] Valider localement `pre.004` : `kb_rpc` 63 tests, `kb_execution_api` 21 tests, `kb_execution_safety` 13 tests, `kb_executor_solana_core` 10 tests, `kb_config` 40 tests et Clippy global propre.
- [x] `pre.005` : ajouter `kb_execution_solana` pour assembler les instructions planifiées en transaction legacy, produire les payloads base64 de frais/simulation, lier la simulation au hash exact du message, résoudre exactement les signataires requis via linterface Solana `Signer` et signer séparément hors Tauri. - [x] `pre.005` : ajouter `kb_execution_solana` pour assembler les instructions planifiées en transaction legacy, produire les payloads base64 de frais/simulation, lier la simulation au hash exact du message, résoudre exactement les signataires requis via linterface Solana `Signer` et signer séparément hors Tauri.
- [x] `pre.005` : renommer la constante interne en `MAINNET_GENESIS_HASH` sans changer sa valeur ; conserver `mainnet-beta` seulement comme alias historique des endpoints/CLI et renommer le variant public en `Mainnet` sérialisé `mainnet`. - [x] `pre.005` : renommer la constante interne en `MAINNET_GENESIS_HASH` sans changer sa valeur ; conserver `mainnet-beta` seulement comme alias historique des endpoints/CLI et renommer le variant public en `Mainnet` sérialisé `mainnet`.
- [x] `pre.005` : distinguer la simulation exacte de la simulation avec remplacement de blockhash et interdire quun résultat `replaceRecentBlockhash=true` autorise la signature du message original. - [x] `pre.005` : distinguer la simulation exacte de la simulation avec remplacement de blockhash et interdire quun résultat `replaceRecentBlockhash=true` autorise la signature du message original.
- [x] Valider localement les tests ciblés de `pre.005`/`pre.006` : `kb_execution_solana` 7 tests, `kb_execution_api` 22 tests, `kb_execution_safety` 15 tests, `kb_rpc` 63 tests, `kb_executor_solana_core` 10 tests, `kb_wallet` 6 tests et `kb_config` 40 tests. - [x] Valider localement les tests ciblés de `pre.005`/`pre.006` : `kb_execution_solana` 7 tests, `kb_execution_api` 22 tests, `kb_execution_safety` 15 tests, `kb_rpc` 63 tests, `kb_executor_solana_core` 10 tests, `kb_wallet` 6 tests et `kb_config` 40 tests.
- [x] `pre.006` : corriger la compilation croisée de `pre.005`, supprimer lavertissement TS-rs sur lalias historique `mainnet_beta`, utiliser le trait public `TypedInstructionExecutor` dans les tests dassemblage, resynchroniser le contrat de simulation RPC et rendre les erreurs de routage tracing explicites. - [x] `pre.006` : corriger la compilation croisée de `pre.005`, supprimer lavertissement TS-rs sur lalias historique `mainnet_beta`, utiliser le trait public `ExApiTypedInstructionExecutor` dans les tests dassemblage, resynchroniser le contrat de simulation RPC et rendre les erreurs de routage tracing explicites.
- [x] `pre.007` : supprimer le dernier opérateur `?` introduit dans un chemin de production de `kb_execution_api`, le remplacer par un `match` avec propagation explicite et auditer les fichiers dexécution `0.4.2` contre `?`, `unwrap` et `expect` de production. - [x] `pre.007` : supprimer le dernier opérateur `?` introduit dans un chemin de production de `kb_execution_api`, le remplacer par un `match` avec propagation explicite et auditer les fichiers dexécution `0.4.2` contre `?`, `unwrap` et `expect` de production.
- [x] Valider localement `pre.007` : `kb_execution_api` 22 tests et Clippy global propre. - [x] Valider localement `pre.007` : `kb_execution_api` 22 tests et Clippy global propre.
- [x] `pre.008` : ajouter les contrats RPC typés `getBalance`, `requestAirdrop`, `sendTransaction`, `getSignatureStatuses` et `getBlockHeight`, avec routage par rôle, préflight obligatoire, contrôle de la signature retournée et confirmation bornée jusquà succès, échec, expiration ou timeout. - [x] `pre.008` : ajouter les contrats RPC typés `getBalance`, `requestAirdrop`, `sendTransaction`, `getSignatureStatuses` et `getBlockHeight`, avec routage par rôle, préflight obligatoire, contrôle de la signature retournée et confirmation bornée jusquà succès, échec, expiration ou timeout.
@@ -603,7 +603,7 @@ Les contrôles autrefois prévus dans `0.3.5` sont reclassés ainsi : la stabili
- [x] Valider localement `pre.019` : `kb_executor_solana_core` 70 tests, `kb_execution_api` 22, `kb_execution_safety` 15, `kb_execution_solana` 12, `kb_rpc` 70 et Clippy global propre. - [x] Valider localement `pre.019` : `kb_executor_solana_core` 70 tests, `kb_execution_api` 22, `kb_execution_safety` 15, `kb_execution_solana` 12, `kb_rpc` 70 et Clippy global propre.
- [x] `pre.020` : onze opérations Loader v3 et neuf opérations Loader v4 réellement constructibles, avec déploiement/upgrade/autorités/fermeture hors UI; BPF Loader v1/v2 restent historiques `decode-only` et Native Loader est classé sans instruction client. - [x] `pre.020` : onze opérations Loader v3 et neuf opérations Loader v4 réellement constructibles, avec déploiement/upgrade/autorités/fermeture hors UI; BPF Loader v1/v2 restent historiques `decode-only` et Native Loader est classé sans instruction client.
- [x] Valider localement `pre.020` : `kb_executor_solana_core` 81 tests, `kb_decoder_solana_core` 115, `kb_execution_api` 22, `kb_execution_safety` 15, `kb_execution_solana` 12 et `kb_rpc` 70. - [x] Valider localement `pre.020` : `kb_executor_solana_core` 81 tests, `kb_decoder_solana_core` 115, `kb_execution_api` 22, `kb_execution_safety` 15, `kb_execution_solana` 12 et `kb_rpc` 70.
- [x] `pre.021` : centraliser dans un module privé les parsers `Pubkey`/program ID et les validations communes de longueur, montant positif, comptes distincts, dérivation seedée et erreurs partagées ; supprimer les implémentations de production identiques sans modifier les 109 opérations ni leur wire. - [x] `pre.021` : centraliser dans un module privé les parsers `MdPubkey`/program ID et les validations communes de longueur, montant positif, comptes distincts, dérivation seedée et erreurs partagées ; supprimer les implémentations de production identiques sans modifier les 109 opérations ni leur wire.
- [x] Valider localement `pre.021` après `fix.001` : `kb_executor_solana_core` 86 tests et `cargo clippy --all-targets` propre ; ce Clippy couvre également les changements Loader de `pre.020`. - [x] Valider localement `pre.021` après `fix.001` : `kb_executor_solana_core` 86 tests et `cargo clippy --all-targets` propre ; ce Clippy couvre également les changements Loader de `pre.020`.
- [x] `pre.022` : implémenter le préflight stateful Localnet/Devnet pour ALT, Config, Feature, Slashing et contextes ZK ElGamal ; ajouter `getEpochInfo` typé et la matrice machine-readable complète des 18 surfaces natives avec classification de toute opération non invocable. - [x] `pre.022` : implémenter le préflight stateful Localnet/Devnet pour ALT, Config, Feature, Slashing et contextes ZK ElGamal ; ajouter `getEpochInfo` typé et la matrice machine-readable complète des 18 surfaces natives avec classification de toute opération non invocable.
- [x] Valider localement `pre.022` : `kb_executor_solana_core` 87 tests, `kb_pipeline` 56 tests, `kb_rpc` 71 tests, `kb_execution_api` 22 tests, `kb_execution_safety` 15 tests, `kb_execution_solana` 12 tests, validateur de matrice réussi et `cargo clippy --all-targets` propre. - [x] Valider localement `pre.022` : `kb_executor_solana_core` 87 tests, `kb_pipeline` 56 tests, `kb_rpc` 71 tests, `kb_execution_api` 22 tests, `kb_execution_safety` 15 tests, `kb_execution_solana` 12 tests, validateur de matrice réussi et `cargo clippy --all-targets` propre.

View File

@@ -138,7 +138,7 @@ Aucun renommage massif de crates n'est autorisé sans étape de contrôle dédi
- Une crate est opérationnelle lorsquelle effectue des I/O, orchestre un pipeline, décode, matérialise, exécute, applique une politique runtime ou prend une décision mutable observable. - Une crate est opérationnelle lorsquelle effectue des I/O, orchestre un pipeline, décode, matérialise, exécute, applique une politique runtime ou prend une décision mutable observable.
- Toute crate opérationnelle ajoutée ou modifiée doit dépendre de `tracing` depuis le workspace et déclarer exactement un `pub(crate) const TRACING_TARGET` dans `src/constants.rs`. - Toute crate opérationnelle ajoutée ou modifiée doit dépendre de `tracing` depuis le workspace et déclarer exactement un `pub(crate) const TRACING_TARGET` dans `src/constants.rs`.
- La valeur canonique de `TRACING_TARGET` est le nom exact du package Cargo. Les targets historiques `khbot.*`, les suffixes de module et les targets de fenêtre sont interdits dans les nouvelles modifications. - La valeur canonique de `DC_METADATA_MTM_TRACING_TARGET` est le nom exact du package Cargo. Les targets historiques `khbot.*`, les suffixes de module et les targets de fenêtre sont interdits dans les nouvelles modifications.
- Les macros `tracing` doivent utiliser `target: crate::TRACING_TARGET` et des champs structurés stables. La granularité interne passe par `action`, `stage`, `window`, `campaign_id`, `signature`, `instruction_path`, `program_id`, `processor_name`, `processor_version`, `status` et `error_code`. - Les macros `tracing` doivent utiliser `target: crate::TRACING_TARGET` et des champs structurés stables. La granularité interne passe par `action`, `stage`, `window`, `campaign_id`, `signature`, `instruction_path`, `program_id`, `processor_name`, `processor_version`, `status` et `error_code`.
- Les crates passives de types, contrats, DTO, API sans exécution, registres ou constantes restent sans dépendance `tracing`. `kb_config` reste une exception de bootstrap tant que sa validation précède linstallation du subscriber. - Les crates passives de types, contrats, DTO, API sans exécution, registres ou constantes restent sans dépendance `tracing`. `kb_config` reste une exception de bootstrap tant que sa validation précède linstallation du subscriber.
- Il est interdit dajouter `tracing` sans événement réel ou de conserver un faux target uniquement consommé par `let _target`. - Il est interdit dajouter `tracing` sans événement réel ou de conserver un faux target uniquement consommé par `let _target`.
@@ -150,14 +150,14 @@ Aucun renommage massif de crates n'est autorisé sans étape de contrôle dédi
- Chaque profil doit router les événements vers les sorties globales `debug.log`, `info.log`, `error.jsonl` et `app.log`, puis vers `debug.log`, `info.log` et `error.jsonl` dans un répertoire propre à chaque crate utilisant `tracing`. - Chaque profil doit router les événements vers les sorties globales `debug.log`, `info.log`, `error.jsonl` et `app.log`, puis vers `debug.log`, `info.log` et `error.jsonl` dans un répertoire propre à chaque crate utilisant `tracing`.
- Lajout ou la suppression de `tracing.workspace = true` dans une crate impose la mise à jour simultanée de la matrice de routes, de ses tests et de `docs/TRACING_CONTRACT.md`. - Lajout ou la suppression de `tracing.workspace = true` dans une crate impose la mise à jour simultanée de la matrice de routes, de ses tests et de `docs/TRACING_CONTRACT.md`.
- Le contrat détaillé est défini dans `docs/TRACING_CONTRACT.md`. - Le contrat détaillé est défini dans `docs/TRACING_CONTRACT.md`.
- Laudit mécanique spécifique au projet est exécuté par `python3 scripts/audit_khadhroony_workspace_rules.py`. Il couvre notamment `TRACING_TARGET` et lusage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`. - Laudit mécanique spécifique au projet est exécuté par `python3 scripts/audit_khadhroony_workspace_rules.py`. Il couvre notamment `DC_METADATA_MTM_TRACING_TARGET` et lusage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`.
## Règles de réutilisation des interfaces Solana et SPL ## Règles de réutilisation des interfaces Solana et SPL
- Les dépendances déclarées dans `[workspace.dependencies]` forment un catalogue de versions et de features autorisées ; elles ne doivent être ajoutées à une crate consommatrice que lorsquun type, un encodeur, un décodeur ou un identifiant officiel est réellement utilisé. - Les dépendances déclarées dans `[workspace.dependencies]` forment un catalogue de versions et de features autorisées ; elles ne doivent être ajoutées à une crate consommatrice que lorsquun type, un encodeur, un décodeur ou un identifiant officiel est réellement utilisé.
- Dans un `Cargo.toml`, placer dans `[dependencies]` toute crate référencée par le code de bibliothèque compilé en production. Réserver `[dev-dependencies]` aux références contenues exclusivement dans `#[cfg(test)]`, les tests dintégration, benches ou exemples. Une dépendance de test vers un décodeur ou matérialiseur concret est légitime lorsquelle sert uniquement à éprouver une orchestration générique fondée sur les traits API ; elle ne prouve pas quune capacité de production manque. Toute promotion de `dev-dependencies` vers `dependencies` doit être motivée par un appel runtime réel, et toute dépendance runtime inutilisée doit être supprimée. - Dans un `Cargo.toml`, placer dans `[dependencies]` toute crate référencée par le code de bibliothèque compilé en production. Réserver `[dev-dependencies]` aux références contenues exclusivement dans `#[cfg(test)]`, les tests dintégration, benches ou exemples. Une dépendance de test vers un décodeur ou matérialiseur concret est légitime lorsquelle sert uniquement à éprouver une orchestration générique fondée sur les traits API ; elle ne prouve pas quune capacité de production manque. Toute promotion de `dev-dependencies` vers `dependencies` doit être motivée par un appel runtime réel, et toute dépendance runtime inutilisée doit être supprimée.
- Les registres de composition runtime des applications doivent énumérer explicitement chaque décodeur et matérialiseur concret activé. Toute nouvelle surface instructionnelle dotée dun `EventMaterializer` doit être ajoutée au registre applicatif et couverte par un test dinventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` nest pas activée automatiquement. Les matérialiseurs exclusivement stateful qui nimplémentent pas `EventMaterializer` restent routés par leurs APIs de snapshots dédiées. - Les registres de composition runtime des applications doivent énumérer explicitement chaque décodeur et matérialiseur concret activé. Toute nouvelle surface instructionnelle dotée dun `MtApiEventMaterializer` doit être ajoutée au registre applicatif et couverte par un test dinventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` nest pas activée automatiquement. Les matérialiseurs exclusivement stateful qui nimplémentent pas `MtApiEventMaterializer` restent routés par leurs APIs de snapshots dédiées.
- Les corrélations instruction/état doivent produire une issue explicite (`confirmed`, `contradicted` ou `not_applicable`) et ne doivent jamais transformer automatiquement une configuration observée en violation, score ou conclusion métier. - Les corrélations instruction/état doivent produire une issue explicite (`confirmed`, `contradicted` ou `not_applicable`) et ne doivent jamais transformer automatiquement une configuration observée en violation, score ou conclusion métier.
- Une interface officielle Solana ou SPL étroite doit être préférée à `solana-sdk` lorsque son contrat suffit. - Une interface officielle Solana ou SPL étroite doit être préférée à `solana-sdk` lorsque son contrat suffit.
- Lordre de préférence des formats est : schéma officiel `wincode`, schéma officiel Borsh, puis parseur local borné reproduisant exactement le runtime lorsque linterface officielle nexpose que `bincode`. - Lordre de préférence des formats est : schéma officiel `wincode`, schéma officiel Borsh, puis parseur local borné reproduisant exactement le runtime lorsque linterface officielle nexpose que `bincode`.

View File

@@ -10,12 +10,12 @@ mod error;
mod module; mod module;
/// Workspace-wide explicit error type. /// Workspace-wide explicit error type.
pub use crate::error::Error; pub use self::error::Error;
/// Workspace-wide result alias. /// Workspace-wide result alias.
pub use crate::error::Result; pub use self::error::Result;
/// Processing module category. /// Processing module category.
pub use crate::module::ModuleKind; pub use self::module::ModuleKind;
/// Stable module name. /// Stable module name.
pub use crate::module::ModuleName; pub use self::module::ModuleName;
/// Stable semantic module version. /// Stable semantic module version.
pub use crate::module::ModuleVersion; pub use self::module::ModuleVersion;

View File

@@ -7,7 +7,7 @@
## Décodeur Solana Core ## Décodeur Solana Core
`SolanaCoreDecoder` est le premier décodeur concret porté depuis bot2. Il implémente `InstructionDecoder` et `ProtocolDecoder` sans dépendre de PostgreSQL, du RPC, de Tauri ou du wallet. `DcSolanaCoreDecoder` est le premier décodeur concret porté depuis bot2. Il implémente `DcApiInstructionDecoder` et `DcApiProtocolDecoder` sans dépendre de PostgreSQL, du RPC, de Tauri ou du wallet.
Il couvre les 18 surfaces natives suivantes : Il couvre les 18 surfaces natives suivantes :
@@ -25,13 +25,13 @@ La matrice `docs/NATIVE_SOLANA_DECODER_MATRIX.json` reste la source machine-read
## Décodeur SPL Memo ## Décodeur SPL Memo
`SplMemoDecoder` couvre exactement les générations v1, v3 et v4. Le payload est lu comme un message brut sans discriminator, borné à 4 096 octets, puis projeté avec son texte UTF-8 complet, sa longueur, son SHA-256, les comptes ordonnés et le statut de commit. `DcSplMemoDecoder` couvre exactement les générations v1, v3 et v4. Le payload est lu comme un message brut sans discriminator, borné à 4 096 octets, puis projeté avec son texte UTF-8 complet, sa longueur, son SHA-256, les comptes ordonnés et le statut de commit.
Memo v1 ignore les comptes lors de la validation runtime. Memo v3 et v4 exigent que chaque compte fourni soit signer. Les transactions échouées restent des intentions non commitées et les payloads UTF-8 invalides ou signatures manquantes deviennent des tentatives invalides explicites. La matrice normative est `docs/SPL_MEMO_MATRIX.json`. Memo v1 ignore les comptes lors de la validation runtime. Memo v3 et v4 exigent que chaque compte fourni soit signer. Les transactions échouées restent des intentions non commitées et les payloads UTF-8 invalides ou signatures manquantes deviennent des tentatives invalides explicites. La matrice normative est `docs/SPL_MEMO_MATRIX.json`.
## Décodeur SPL Token classique ## Décodeur SPL Token classique
`SplTokenDecoder` couvre exclusivement le Program ID classique `DcSplTokenDecoder` couvre exclusivement le Program ID classique
`TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`. Il publie 28 déclarations de couverture pour `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`. Il publie 28 déclarations de couverture pour
les tags `0..24`, `38`, `45` et `255`, y compris les variantes historiques, checked, les tags `0..24`, `38`, `45` et `255`, y compris les variantes historiques, checked,
`WithdrawExcessLamports`, `UnwrapLamports` et `Batch`. `WithdrawExcessLamports`, `UnwrapLamports` et `Batch`.
@@ -45,7 +45,7 @@ normative est `docs/SPL_TOKEN_MATRIX.json`.
## Décodeur SPL Associated Token Account ## Décodeur SPL Associated Token Account
`SplAssociatedTokenAccountDecoder` couvre exclusivement `DcSplAssociatedTokenAccountDecoder` couvre exclusivement
`ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL`. Il reconnaît les trois variantes publiées `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL`. Il reconnaît les trois variantes publiées
`Create`, `CreateIdempotent` et `RecoverNested`, ainsi que lencodage historique vide de `Create`. `Create`, `CreateIdempotent` et `RecoverNested`, ainsi que lencodage historique vide de `Create`.
@@ -58,7 +58,7 @@ Program ID sans reconstruire leur état ni interpréter leurs extensions. La mat
## Décodeur SPL Token2022 ## Décodeur SPL Token2022
`SplToken2022Decoder` couvre exclusivement `DcSplToken2022Decoder` couvre exclusivement
`TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`. Il conserve les 48 enveloppes de premier niveau, `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`. Il conserve les 48 enveloppes de premier niveau,
les sous-instructions dextensions dont le wire est officiellement identifiable, les interfaces les sous-instructions dextensions dont le wire est officiellement identifiable, les interfaces
Token Metadata et Token Group exécutées directement par Token2022, ainsi que `Batch` sans batch Token Metadata et Token Group exécutées directement par Token2022, ainsi que `Batch` sans batch
@@ -67,22 +67,22 @@ imbriqué.
Le décodeur borne les payloads, les chaînes de metadata, le nombre denfants et les comptes Le décodeur borne les payloads, les chaînes de metadata, le nombre denfants et les comptes
cumulés. Les comptes, autorités, offsets de preuve, suffixes et chemins outer/inner restent cumulés. Les comptes, autorités, offsets de preuve, suffixes et chemins outer/inner restent
ordonnés et exacts. Une transaction échouée produit une intention non commitée. Le parseur public ordonnés et exacts. Une transaction échouée produit une intention non commitée. Le parseur public
`parse_token_2022_state()` distingue Mint, Account et Multisig, conserve la base exacte et expose `decoder_spl_token2022_parse_token2022_state()` distingue Mint, Account et Multisig, conserve la base exacte et expose
les entrées TLV ordonnées sans inventer létat dun programme externe pointé. La matrice normative les entrées TLV ordonnées sans inventer létat dun programme externe pointé. La matrice normative
est `docs/SPL_TOKEN_2022_MATRIX.json`. est `docs/SPL_TOKEN_2022_MATRIX.json`.
## Décodeur du registre ElGamal ## Décodeur du registre ElGamal
`SplElgamalRegistryDecoder` couvre le programme indépendant `DcSplElgamalRegistryDecoder` couvre le programme indépendant
`regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg`. Il décode exactement `CreateRegistry` et `regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg`. Il décode exactement `CreateRegistry` et
`UpdateRegistry`, conserve loffset relatif de preuve et ne prétend jamais vérifier la preuve ZK. `UpdateRegistry`, conserve loffset relatif de preuve et ne prétend jamais vérifier la preuve ZK.
`parse_elgamal_registry_state()` exige exactement 64 octets et restitue le wallet propriétaire, la `decoder_spl_elgamal_registry_parse_elgamal_registry_state()` exige exactement 64 octets et restitue le wallet propriétaire, la
clé publique ElGamal et le wire complet. La matrice normative est clé publique ElGamal et le wire complet. La matrice normative est
`docs/SPL_ELGAMAL_REGISTRY_MATRIX.json`. `docs/SPL_ELGAMAL_REGISTRY_MATRIX.json`.
## Décodeur Metaplex Token Metadata ## Décodeur Metaplex Token Metadata
`MetadataMetaplexTokenMetadataDecoder` couvre exclusivement `DcMetadataMetaplexTokenMetadataDecoder` couvre exclusivement
`metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s`. Il inventorie exactement les 58 `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s`. Il inventorie exactement les 58
discriminateurs `0..=57`, conserve les arguments Borsh, les comptes positionnels, discriminateurs `0..=57`, conserve les arguments Borsh, les comptes positionnels,
les placeholders optionnels, les chemins outer/CPI et les transactions échouées les placeholders optionnels, les chemins outer/CPI et les transactions échouées
@@ -100,22 +100,22 @@ politique dexécution définitivement interdite. La matrice normative est
## API publique utile ## API publique utile
- `EventMaterializer`, `MaterializerIdentity`, `MaterializationTransactionPolicy`, `MaterializerExecutionResult` et `MaterializedOutput` : contrat complet utilisable par un matérialiseur interne ou externe ; - `MtApiEventMaterializer`, `MtApiMaterializerIdentity`, `MtApiMaterializationTransactionPolicy`, `MtApiMaterializerExecutionResult` et `MtApiMaterializedOutput` : contrat complet utilisable par un matérialiseur interne ou externe ;
- `LifecycleMaterializer`, `AdminMaterializer`, `ComplianceAuditMaterializer` et `StakingMaterializer` : matérialisateurs Solana natifs concrets ; - `MtLifecycleMaterializer`, `MtAdminMaterializer`, `MtComplianceAuditMaterializer` et `MtStakingMaterializer` : matérialisateurs Solana natifs concrets ;
- `materialize_token_2022_admin_state_snapshots()` et `materialize_elgamal_registry_state_snapshot()` : projections stateful dadministration déjà exposées ; - `materialize_token2022_admin_state_snapshots()` et `materialize_elgamal_registry_state_snapshot()` : projections stateful dadministration déjà exposées ;
- `SolanaCoreDecoder` : décodeur concret natif ; - `DcSolanaCoreDecoder` : décodeur concret natif ;
- `SplMemoDecoder` : décodeur exact des trois générations SPL Memo ; - `DcSplMemoDecoder` : décodeur exact des trois générations SPL Memo ;
- `SplTokenDecoder` : décodeur exact du programme SPL Token classique ; - `DcSplTokenDecoder` : décodeur exact du programme SPL Token classique ;
- `SplAssociatedTokenAccountDecoder` : décodeur exact du programme Associated Token Account ; - `DcSplAssociatedTokenAccountDecoder` : décodeur exact du programme Associated Token Account ;
- `SplToken2022Decoder` : décodeur exact des instructions Token2022 ; - `DcSplToken2022Decoder` : décodeur exact des instructions Token2022 ;
- `Token2022State`, `Token2022StateKind`, `Token2022TlvEntry` et `parse_token_2022_state()` : API publique de lecture détat Token2022 ; - `DcToken2022State`, `DcToken2022StateKind`, `DcToken2022TlvEntry` et `decoder_spl_token2022_token2022_state()` : API publique de lecture détat Token2022 ;
- `SplElgamalRegistryDecoder`, `ElGamalRegistryState` et `parse_elgamal_registry_state()` : API publique du registre ElGamal ; - `DcSplElgamalRegistryDecoder`, `DcSplElGamalRegistryState` et `decoder_spl_elgamal_registry_parse_elgamal_registry_state()` : API publique du registre ElGamal ;
- `MetadataMetaplexTokenMetadataDecoder` : décodeur exact du programme Metaplex Token Metadata ; - `DcMetadataMetaplexTokenMetadataDecoder` : décodeur exact du programme Metaplex Token Metadata ;
- `kb_lib::decoder::metadata::metaplex_token_metadata` : parseurs et snapshots publics des comptes Metaplex ; - `kb_lib::decoder::metadata::metaplex_token_metadata` : parseurs et snapshots publics des comptes Metaplex ;
- `InstructionDecoder` : contrat de reconnaissance, couverture et décodage contextualisé ; - `DcApiInstructionDecoder` : contrat de reconnaissance, couverture et décodage contextualisé ;
- `ProtocolDecoder` : contrat de compatibilité avec les observations historiques ; - `DcApiProtocolDecoder` : contrat de compatibilité avec les observations historiques ;
- `CoreInstructionReplayInput` : input source-neutral produit par lextraction core ; - `MdCoreInstructionReplayInput` : input source-neutral produit par lextraction core ;
- `DecoderExecutionResult`, `DecoderRecognition` et `DecoderCoverageDeclaration` : résultats typés du pipeline ; - `DcApiDecoderExecutionResult`, `DcApiDecoderRecognition` et `DcApiDecoderCoverageDeclaration` : résultats typés du pipeline ;
- modèles canoniques et nomenclature réexportés depuis la façade. - modèles canoniques et nomenclature réexportés depuis la façade.
Les helpers, constantes wire et types intermédiaires de chaque composant restent internes. Leurs noms sont préfixés au niveau de la façade interne afin déviter les collisions lors de la fusion des anciens crates. Les helpers, constantes wire et types intermédiaires de chaque composant restent internes. Leurs noms sont préfixés au niveau de la façade interne afin déviter les collisions lors de la fusion des anciens crates.

View File

@@ -3,164 +3,498 @@
//! Consolidated decoder modules. //! Consolidated decoder modules.
pub mod adapter; mod adapter;
pub mod admin; mod admin;
pub mod amm; mod amm;
pub mod anchor; mod anchor;
pub mod api; mod api;
pub mod bridge; mod bridge;
pub mod clmm; mod clmm;
pub mod cpmm; mod cpmm;
pub mod dlmm; mod dlmm;
pub mod fees; mod fees;
pub mod governance; mod governance;
pub mod launchpad; mod launchpad;
pub mod lending; mod lending;
pub mod lock; mod lock;
pub mod metadata; mod metadata;
pub mod nft; mod nft;
pub mod orderbook; mod orderbook;
pub mod perpetuals; mod perpetuals;
pub mod router; mod router;
pub mod rwa; mod rwa;
pub mod solana; mod solana;
pub mod spl; mod spl;
pub mod stable; mod stable;
pub mod staking; mod staking;
pub mod treasury; mod treasury;
pub mod vault; mod vault;
pub mod vesting; mod vesting;
pub mod wallet; mod wallet;
pub mod weighted; mod weighted;
/// One parsed SPL ElGamal registry instruction. /// Approve Collection Authority discriminator.
pub(crate) use self::spl::ParsedRegistryInstruction; pub(crate) use self::metadata::DC_METADATA_MTM_APPROVE_COLLECTION_AUTHORITY_DISCRIMINATOR;
/// Approve Use Authority discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_APPROVE_USE_AUTHORITY_DISCRIMINATOR;
/// Bubblegum Set Collection Size discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_BUBBLEGUM_SET_COLLECTION_SIZE_DISCRIMINATOR;
/// Burn discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_BURN_DISCRIMINATOR;
/// Historical Burn Edition NFT discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_BURN_EDITION_NFT_DISCRIMINATOR;
/// Historical Burn NFT discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_BURN_NFT_DISCRIMINATOR;
/// Close Accounts discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CLOSE_ACCOUNTS_DISCRIMINATOR;
/// Close Escrow Account discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CLOSE_ESCROW_ACCOUNT_DISCRIMINATOR;
/// Collect discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_COLLECT_DISCRIMINATOR;
/// Convert Master Edition V1 to V2 discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CONVERT_MASTER_EDITION_V1_TO_V2_DISCRIMINATOR;
/// Modern Create discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CREATE_DISCRIMINATOR;
/// Create Escrow Account discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CREATE_ESCROW_ACCOUNT_DISCRIMINATOR;
/// Historical Create Master Edition discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CREATE_MASTER_EDITION_DISCRIMINATOR;
/// Create Master Edition V3 discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CREATE_MASTER_EDITION_V3_DISCRIMINATOR;
/// Historical Create Metadata Account discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CREATE_METADATA_ACCOUNT_DISCRIMINATOR;
/// Historical Create Metadata Account V2 discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CREATE_METADATA_ACCOUNT_V2_DISCRIMINATOR;
/// Create Metadata Account V3 discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_CREATE_METADATA_ACCOUNT_V3_DISCRIMINATOR;
/// Delegate discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_DELEGATE_DISCRIMINATOR;
/// Deprecated Create Master Edition discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_DEPRECATED_CREATE_MASTER_EDITION_DISCRIMINATOR;
/// Deprecated Create Reservation List discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_DEPRECATED_CREATE_RESERVATION_LIST_DISCRIMINATOR;
/// Deprecated printing-token mint-new-edition discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_DEPRECATED_MINT_NEW_EDITION_VIA_PRINTING_TOKEN_DISCRIMINATOR;
/// Deprecated Mint Printing Tokens discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_DEPRECATED_MINT_PRINTING_TOKENS_DISCRIMINATOR;
/// Deprecated Mint Printing Tokens Via Token discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_DEPRECATED_MINT_PRINTING_TOKENS_VIA_TOKEN_DISCRIMINATOR;
/// Deprecated Set Reservation List discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_DEPRECATED_SET_RESERVATION_LIST_DISCRIMINATOR;
/// Number of bytes retained in malformed-wire diagnostics.
pub(crate) use self::metadata::DC_METADATA_MTM_DIAGNOSTIC_PREFIX_BYTES;
/// Stable event payload contract version.
pub(crate) use self::metadata::DC_METADATA_MTM_EVENT_VERSION;
/// Freeze Delegated Account discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_FREEZE_DELEGATED_ACCOUNT_DISCRIMINATOR;
/// Current pre-release instruction inventory.
pub(crate) use self::metadata::DC_METADATA_MTM_INSTRUCTION_ENTRIES;
/// Lock discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_LOCK_DISCRIMINATOR;
/// Maximum encoded base64 instruction payload size.
pub(crate) use self::metadata::DC_METADATA_MTM_MAX_BASE64_BYTES;
/// Maximum number of instruction accounts accepted by this decoder.
pub(crate) use self::metadata::DC_METADATA_MTM_MAX_INSTRUCTION_ACCOUNTS;
/// Tracing target for this decoder.
/// Maximum retained instruction payload size.
pub(crate) use self::metadata::DC_METADATA_MTM_MAX_INSTRUCTION_BYTES;
/// Migrate discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_MIGRATE_DISCRIMINATOR;
/// Modern Mint discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_MINT_DISCRIMINATOR;
/// Mint New Edition From Master Edition Via Token discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_MINT_NEW_EDITION_FROM_MASTER_EDITION_VIA_TOKEN_DISCRIMINATOR;
/// Mint New Edition From Master Edition Via Vault Proxy discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_MINT_NEW_EDITION_FROM_MASTER_EDITION_VIA_VAULT_PROXY_DISCRIMINATOR;
/// Modern Print discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_PRINT_DISCRIMINATOR;
/// Puff Metadata discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_PUFF_METADATA_DISCRIMINATOR;
/// Remove Creator Verification discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_REMOVE_CREATOR_VERIFICATION_DISCRIMINATOR;
/// Resize discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_RESIZE_DISCRIMINATOR;
/// Revoke Collection Authority discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_REVOKE_COLLECTION_AUTHORITY_DISCRIMINATOR;
/// Revoke discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_REVOKE_DISCRIMINATOR;
/// Revoke Use Authority discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_REVOKE_USE_AUTHORITY_DISCRIMINATOR;
/// Set And Verify Collection discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_SET_AND_VERIFY_COLLECTION_DISCRIMINATOR;
/// Set And Verify Sized Collection Item discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_SET_AND_VERIFY_SIZED_COLLECTION_ITEM_DISCRIMINATOR;
/// Set Collection Size discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_SET_COLLECTION_SIZE_DISCRIMINATOR;
/// Set Token Standard discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_SET_TOKEN_STANDARD_DISCRIMINATOR;
/// Sign Metadata discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_SIGN_METADATA_DISCRIMINATOR;
/// Stable decoder surface code.
pub(crate) use self::metadata::DC_METADATA_MTM_SURFACE_CODE;
/// Thaw Delegated Account discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_THAW_DELEGATED_ACCOUNT_DISCRIMINATOR;
/// Canonical tracing target for this crate.
pub(crate) use self::metadata::DC_METADATA_MTM_TRACING_TARGET;
/// Transfer discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_TRANSFER_DISCRIMINATOR;
/// Transfer Out Of Escrow discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_TRANSFER_OUT_OF_ESCROW_DISCRIMINATOR;
/// Unlock discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UNLOCK_DISCRIMINATOR;
/// Unverify Collection discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UNVERIFY_COLLECTION_DISCRIMINATOR;
/// Modern Unverify discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UNVERIFY_DISCRIMINATOR;
/// Unverify Sized Collection Item discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UNVERIFY_SIZED_COLLECTION_ITEM_DISCRIMINATOR;
/// Modern Update discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UPDATE_DISCRIMINATOR;
/// Historical Update Metadata Account discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UPDATE_METADATA_ACCOUNT_DISCRIMINATOR;
/// Update Metadata Account V2 discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UPDATE_METADATA_ACCOUNT_V2_DISCRIMINATOR;
/// Update Primary Sale Happened Via Token discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UPDATE_PRIMARY_SALE_HAPPENED_VIA_TOKEN_DISCRIMINATOR;
/// Modern Use discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_USE_DISCRIMINATOR;
/// Utilize discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_UTILIZE_DISCRIMINATOR;
/// Verify Collection discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_VERIFY_COLLECTION_DISCRIMINATOR;
/// Modern Verify discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_VERIFY_DISCRIMINATOR;
/// Verify Sized Collection Item discriminator.
pub(crate) use self::metadata::DC_METADATA_MTM_VERIFY_SIZED_COLLECTION_ITEM_DISCRIMINATOR;
/// Crate-root access to `decode` from `instruction`.
pub(crate) use self::metadata::decoder_metadata_metaplex_token_metadata_decode;
/// Crate-root access to `entry_for_discriminator` from `instruction`.
pub(crate) use self::metadata::decoder_metadata_metaplex_token_metadata_entry_for_discriminator;
/// Crate-root access to `payload_discriminator` from `instruction`.
pub(crate) use self::metadata::decoder_metadata_metaplex_token_metadata_payload_discriminator;
pub(crate) use self::solana::DC_SOLANA_CORE_ADDRESS_LOOKUP_TABLE_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_BPF_LOADER_DEPRECATED_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_BPF_LOADER_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_BPF_LOADER_UPGRADEABLE_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_COMPUTE_BUDGET_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_CONFIG_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_ED25519_PUBLIC_KEY_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_ED25519_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_FEATURE_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_LOADER_V4_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_MAX_NATIVE_INSTRUCTION_PAYLOAD_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_NATIVE_EVENT_VERSION;
pub(crate) use self::solana::DC_SOLANA_CORE_NATIVE_LOADER_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_PRECOMPILE_COMPONENT_PREFIX_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_PROTOCOL_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_SECP256K1_ETHEREUM_ADDRESS_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_SECP256K1_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_SECP256R1_MAX_SIGNATURES;
pub(crate) use self::solana::DC_SOLANA_CORE_SECP256R1_PUBLIC_KEY_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_SECP256R1_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_SIGNATURE_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_SLASHING_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_STAKE_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_SYSTEM_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_TRACING_TARGET;
pub(crate) use self::solana::DC_SOLANA_CORE_U8_OFFSETS_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_U16_OFFSETS_BYTES;
pub(crate) use self::solana::DC_SOLANA_CORE_VOTE_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_ZK_ELGAMAL_PROOF_SURFACE_CODE;
pub(crate) use self::solana::DC_SOLANA_CORE_ZK_TOKEN_PROOF_SURFACE_CODE;
pub(crate) use self::solana::DcSolanaCoreAccountRole;
pub(crate) use self::solana::DcSolanaCoreResolvedInstructionPayload;
pub(crate) use self::solana::decoder_solana_core_address_lookup_table_coverage;
pub(crate) use self::solana::decoder_solana_core_address_lookup_table_decode;
pub(crate) use self::solana::decoder_solana_core_address_lookup_table_recognize;
pub(crate) use self::solana::decoder_solana_core_bounded_hexadecimal_prefix;
pub(crate) use self::solana::decoder_solana_core_bounded_slice;
pub(crate) use self::solana::decoder_solana_core_compute_budget_coverage;
pub(crate) use self::solana::decoder_solana_core_compute_budget_decode;
pub(crate) use self::solana::decoder_solana_core_compute_budget_recognize;
pub(crate) use self::solana::decoder_solana_core_config_coverage;
pub(crate) use self::solana::decoder_solana_core_config_decode;
pub(crate) use self::solana::decoder_solana_core_config_recognize;
pub(crate) use self::solana::decoder_solana_core_decode_instruction_data;
pub(crate) use self::solana::decoder_solana_core_decoded_payload_length;
pub(crate) use self::solana::decoder_solana_core_decoded_payload_sha256;
pub(crate) use self::solana::decoder_solana_core_decoded_result;
pub(crate) use self::solana::decoder_solana_core_failed_result;
pub(crate) use self::solana::decoder_solana_core_feature_coverage;
pub(crate) use self::solana::decoder_solana_core_feature_decode;
pub(crate) use self::solana::decoder_solana_core_feature_recognize;
pub(crate) use self::solana::decoder_solana_core_hash_bytes;
pub(crate) use self::solana::decoder_solana_core_hexadecimal_prefix;
pub(crate) use self::solana::decoder_solana_core_loaders_coverage;
pub(crate) use self::solana::decoder_solana_core_loaders_decode;
pub(crate) use self::solana::decoder_solana_core_loaders_recognize;
pub(crate) use self::solana::decoder_solana_core_payload_hash;
pub(crate) use self::solana::decoder_solana_core_precompiles_coverage;
pub(crate) use self::solana::decoder_solana_core_precompiles_decode;
pub(crate) use self::solana::decoder_solana_core_precompiles_recognize;
pub(crate) use self::solana::decoder_solana_core_read_u32_le;
pub(crate) use self::solana::decoder_solana_core_read_u64_le;
pub(crate) use self::solana::decoder_solana_core_resolve_accounts;
pub(crate) use self::solana::decoder_solana_core_resolve_u8_instruction_payload;
pub(crate) use self::solana::decoder_solana_core_resolve_u16_instruction_payload;
pub(crate) use self::solana::decoder_solana_core_slashing_coverage;
pub(crate) use self::solana::decoder_solana_core_slashing_decode;
pub(crate) use self::solana::decoder_solana_core_slashing_recognize;
pub(crate) use self::solana::decoder_solana_core_stake_coverage;
pub(crate) use self::solana::decoder_solana_core_stake_decode;
pub(crate) use self::solana::decoder_solana_core_stake_recognize;
pub(crate) use self::solana::decoder_solana_core_system_coverage;
pub(crate) use self::solana::decoder_solana_core_system_decode;
pub(crate) use self::solana::decoder_solana_core_system_recognize;
pub(crate) use self::solana::decoder_solana_core_target_outer_instruction_index;
pub(crate) use self::solana::decoder_solana_core_unsupported_result;
pub(crate) use self::solana::decoder_solana_core_vote_coverage;
pub(crate) use self::solana::decoder_solana_core_vote_decode;
pub(crate) use self::solana::decoder_solana_core_vote_recognize;
pub(crate) use self::solana::decoder_solana_core_zk_elgamal_coverage;
pub(crate) use self::solana::decoder_solana_core_zk_elgamal_decode;
pub(crate) use self::solana::decoder_solana_core_zk_elgamal_recognize;
pub(crate) use self::solana::decoder_solana_core_zk_token_proof_coverage;
pub(crate) use self::solana::decoder_solana_core_zk_token_proof_decode;
pub(crate) use self::solana::decoder_solana_core_zk_token_proof_recognize;
/// Current stable Associated Token Account decoded event contract version. /// Current stable Associated Token Account decoded event contract version.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_EVENT_VERSION; pub(crate) use self::spl::DC_SPL_ATA_EVENT_VERSION;
/// Exact Associated Token Account instructions published by the official interface. /// Exact Associated Token Account instructions published by the official interface.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_INSTRUCTION_ENTRIES; pub(crate) use self::spl::DC_SPL_ATA_INSTRUCTION_ENTRIES;
/// Maximum retained account-key text length for the Associated Token Account decoder. /// Maximum retained account-key text length for the Associated Token Account decoder.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_MAX_ACCOUNT_KEY_BYTES; pub(crate) use self::spl::DC_SPL_ATA_MAX_ACCOUNT_KEY_BYTES;
/// Maximum retained instruction account count for the Associated Token Account decoder. /// Maximum retained instruction account count for the Associated Token Account decoder.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_MAX_ACCOUNTS; pub(crate) use self::spl::DC_SPL_ATA_MAX_ACCOUNTS;
/// Maximum retained semantic diagnostic count for the Associated Token Account decoder. /// Maximum retained semantic diagnostic count for the Associated Token Account decoder.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_MAX_DIAGNOSTICS; pub(crate) use self::spl::DC_SPL_ATA_MAX_DIAGNOSTICS;
/// Maximum retained Associated Token Account instruction payload size. /// Maximum retained Associated Token Account instruction payload size.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_MAX_INSTRUCTION_BYTES; pub(crate) use self::spl::DC_SPL_ATA_MAX_INSTRUCTION_BYTES;
/// Maximum retained transaction account-key count for the Associated Token Account decoder. /// Maximum retained transaction account-key count for the Associated Token Account decoder.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_MAX_TRANSACTION_KEYS; pub(crate) use self::spl::DC_SPL_ATA_MAX_TRANSACTION_KEYS;
/// Stable protocol and surface code for the Associated Token Account program. /// Stable protocol and surface code for the Associated Token Account program.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_SURFACE_CODE; pub(crate) use self::spl::DC_SPL_ATA_SURFACE_CODE;
/// Canonical tracing target for the Associated Token Account decoder. /// Canonical tracing target for the Associated Token Account decoder.
pub(crate) use self::spl::SPL_ASSOCIATED_TOKEN_ACCOUNT_TRACING_TARGET; pub(crate) use self::spl::DC_SPL_ATA_TRACING_TARGET;
/// Current stable SPL ElGamal registry event contract version. /// Current stable SPL ElGamal registry event contract version.
pub(crate) use self::spl::SPL_ELGAMAL_REGISTRY_EVENT_VERSION; pub(crate) use self::spl::DC_SPL_ELGAMAL_REGISTRY_EVENT_VERSION;
/// Maximum retained SPL ElGamal registry instruction payload size. /// Maximum retained SPL ElGamal registry instruction payload size.
pub(crate) use self::spl::SPL_ELGAMAL_REGISTRY_MAX_INSTRUCTION_BYTES; pub(crate) use self::spl::DC_SPL_ELGAMAL_REGISTRY_MAX_INSTRUCTION_BYTES;
/// Stable SPL ElGamal registry surface code. /// Stable SPL ElGamal registry surface code.
pub(crate) use self::spl::SPL_ELGAMAL_REGISTRY_SURFACE_CODE; pub(crate) use self::spl::DC_SPL_ELGAMAL_REGISTRY_SURFACE_CODE;
/// Canonical tracing target for the SPL ElGamal registry decoder. /// Canonical tracing target for the SPL ElGamal registry decoder.
pub(crate) use self::spl::SPL_ELGAMAL_REGISTRY_TRACING_TARGET; pub(crate) use self::spl::DC_SPL_ELGAMAL_REGISTRY_TRACING_TARGET;
/// Maximum payload prefix retained for bounded diagnostics. /// Maximum payload prefix retained for bounded diagnostics.
pub(crate) use self::spl::SPL_MEMO_DIAGNOSTIC_PREFIX_BYTES; pub(crate) use self::spl::DC_SPL_MEMO_DIAGNOSTIC_PREFIX_BYTES;
/// Current stable Memo decoded event contract version. /// Current stable Memo decoded event contract version.
pub(crate) use self::spl::SPL_MEMO_EVENT_VERSION; pub(crate) use self::spl::DC_SPL_MEMO_EVENT_VERSION;
/// Maximum decoded instruction data retained as a complete Memo payload. /// Maximum decoded instruction data retained as a complete Memo payload.
pub(crate) use self::spl::SPL_MEMO_MAX_PAYLOAD_BYTES; pub(crate) use self::spl::DC_SPL_MEMO_MAX_PAYLOAD_BYTES;
/// Stable protocol code shared by Memo generations. /// Stable protocol code shared by Memo generations.
pub(crate) use self::spl::SPL_MEMO_PROTOCOL_CODE; pub(crate) use self::spl::DC_SPL_MEMO_PROTOCOL_CODE;
/// Canonical tracing target for the SPL Memo decoder. /// Canonical tracing target for the SPL Memo decoder.
pub(crate) use self::spl::SPL_MEMO_TRACING_TARGET; pub(crate) use self::spl::DC_SPL_MEMO_TRACING_TARGET;
/// Stable Memo v1 surface code. /// Stable Memo v1 surface code.
pub(crate) use self::spl::SPL_MEMO_V1_SURFACE_CODE; pub(crate) use self::spl::DC_SPL_MEMO_V1_SURFACE_CODE;
/// Stable Memo v3 surface code. /// Stable Memo v3 surface code.
pub(crate) use self::spl::SPL_MEMO_V3_SURFACE_CODE; pub(crate) use self::spl::DC_SPL_MEMO_V3_SURFACE_CODE;
/// Stable Memo v4 surface code. /// Stable Memo v4 surface code.
pub(crate) use self::spl::SPL_MEMO_V4_SURFACE_CODE; pub(crate) use self::spl::DC_SPL_MEMO_V4_SURFACE_CODE;
/// Maximum prefix retained in bounded Token-2022 diagnostics.
pub(crate) use self::spl::SPL_TOKEN_2022_DIAGNOSTIC_PREFIX_BYTES;
/// Current stable Token-2022 decoded event contract version.
pub(crate) use self::spl::SPL_TOKEN_2022_EVENT_VERSION;
/// Exact top-level instruction inventory published by the resolved Token-2022 interface.
pub(crate) use self::spl::SPL_TOKEN_2022_INSTRUCTION_ENTRIES;
/// Maximum total account metas consumed by one Token-2022 batch.
pub(crate) use self::spl::SPL_TOKEN_2022_MAX_BATCH_ACCOUNTS;
/// Maximum decoded sub-instructions in one Token-2022 batch.
pub(crate) use self::spl::SPL_TOKEN_2022_MAX_BATCH_INSTRUCTIONS;
/// Maximum retained Token-2022 instruction payload size.
pub(crate) use self::spl::SPL_TOKEN_2022_MAX_INSTRUCTION_BYTES;
/// Maximum retained UTF-8 string size for embedded Token Metadata instructions.
pub(crate) use self::spl::SPL_TOKEN_2022_MAX_METADATA_STRING_BYTES;
/// Stable Token-2022 surface code.
pub(crate) use self::spl::SPL_TOKEN_2022_SURFACE_CODE;
/// Canonical tracing target for the Token-2022 decoder.
pub(crate) use self::spl::SPL_TOKEN_2022_TRACING_TARGET;
/// Maximum prefix retained in bounded classic SPL Token diagnostics. /// Maximum prefix retained in bounded classic SPL Token diagnostics.
pub(crate) use self::spl::SPL_TOKEN_DIAGNOSTIC_PREFIX_BYTES; pub(crate) use self::spl::DC_SPL_TOKEN_DIAGNOSTIC_PREFIX_BYTES;
/// Current stable classic SPL Token decoded event contract version. /// Current stable classic SPL Token decoded event contract version.
pub(crate) use self::spl::SPL_TOKEN_EVENT_VERSION; pub(crate) use self::spl::DC_SPL_TOKEN_EVENT_VERSION;
/// One exact classic SPL Token instruction entry published by the official interface. /// One exact classic SPL Token instruction entry published by the official interface.
pub(crate) use self::spl::SPL_TOKEN_INSTRUCTION_ENTRIES; pub(crate) use self::spl::DC_SPL_TOKEN_INSTRUCTION_ENTRIES;
/// Maximum total account metas consumed by one classic SPL Token batch. /// Maximum total account metas consumed by one classic SPL Token batch.
pub(crate) use self::spl::SPL_TOKEN_MAX_BATCH_ACCOUNTS; pub(crate) use self::spl::DC_SPL_TOKEN_MAX_BATCH_ACCOUNTS;
/// Maximum decoded sub-instructions in one classic SPL Token batch. /// Maximum decoded sub-instructions in one classic SPL Token batch.
pub(crate) use self::spl::SPL_TOKEN_MAX_BATCH_INSTRUCTIONS; pub(crate) use self::spl::DC_SPL_TOKEN_MAX_BATCH_INSTRUCTIONS;
/// Maximum retained classic SPL Token instruction payload size. /// Maximum retained classic SPL Token instruction payload size.
pub(crate) use self::spl::SPL_TOKEN_MAX_INSTRUCTION_BYTES; pub(crate) use self::spl::DC_SPL_TOKEN_MAX_INSTRUCTION_BYTES;
/// Stable protocol and surface code for the classic SPL Token program. /// Stable protocol and surface code for the classic SPL Token program.
pub(crate) use self::spl::SPL_TOKEN_SURFACE_CODE; pub(crate) use self::spl::DC_SPL_TOKEN_SURFACE_CODE;
/// Canonical tracing target for the classic SPL Token decoder. /// Canonical tracing target for the classic SPL Token decoder.
pub(crate) use self::spl::SPL_TOKEN_TRACING_TARGET; pub(crate) use self::spl::DC_SPL_TOKEN_TRACING_TARGET;
/// Maximum prefix retained in bounded Token-2022 diagnostics.
pub(crate) use self::spl::DC_SPL_TOKEN2022_DIAGNOSTIC_PREFIX_BYTES;
/// Current stable Token-2022 decoded event contract version.
pub(crate) use self::spl::DC_SPL_TOKEN2022_EVENT_VERSION;
/// Exact top-level instruction inventory published by the resolved Token-2022 interface.
pub(crate) use self::spl::DC_SPL_TOKEN2022_INSTRUCTION_ENTRIES;
/// Maximum total account metas consumed by one Token-2022 batch.
pub(crate) use self::spl::DC_SPL_TOKEN2022_MAX_BATCH_ACCOUNTS;
/// Maximum decoded sub-instructions in one Token-2022 batch.
pub(crate) use self::spl::DC_SPL_TOKEN2022_MAX_BATCH_INSTRUCTIONS;
/// Maximum retained Token-2022 instruction payload size.
pub(crate) use self::spl::DC_SPL_TOKEN2022_MAX_INSTRUCTION_BYTES;
/// Maximum retained UTF-8 string size for embedded Token Metadata instructions.
pub(crate) use self::spl::DC_SPL_TOKEN2022_MAX_METADATA_STRING_BYTES;
/// Stable Token-2022 surface code.
pub(crate) use self::spl::DC_SPL_TOKEN2022_SURFACE_CODE;
/// Canonical tracing target for the Token-2022 decoder.
pub(crate) use self::spl::DC_SPL_TOKEN2022_TRACING_TARGET;
/// One parsed SPL ElGamal registry instruction.
pub(crate) use self::spl::DcSplElGamalRegistryParsedRegistryInstruction;
/// Decodes one bounded Associated Token Account instruction. /// Decodes one bounded Associated Token Account instruction.
pub(crate) use self::spl::spl_associated_token_account_decode; pub(crate) use self::spl::decoder_spl_associated_token_account_decode;
/// Returns the exact entry matching an Associated Token Account wire. /// Returns the exact entry matching an Associated Token Account wire.
pub(crate) use self::spl::spl_associated_token_account_entry; pub(crate) use self::spl::decoder_spl_associated_token_account_entry;
/// Reads one bounded Associated Token Account payload. /// Reads one bounded Associated Token Account payload.
pub(crate) use self::spl::spl_associated_token_account_payload; pub(crate) use self::spl::decoder_spl_associated_token_account_payload;
/// Decodes one bounded SPL ElGamal registry instruction. /// Decodes one bounded SPL ElGamal registry instruction.
pub(crate) use self::spl::spl_elgamal_registry_decode; pub(crate) use self::spl::decoder_spl_elgamal_registry_decode;
/// Decodes one bounded SPL ElGamal registry instruction payload. /// Decodes one bounded SPL ElGamal registry instruction payload.
pub(crate) use self::spl::spl_elgamal_registry_decode_payload; pub(crate) use self::spl::decoder_spl_elgamal_registry_decode_payload;
/// Parses one exact SPL ElGamal registry instruction. /// Parses one exact SPL ElGamal registry instruction.
pub(crate) use self::spl::spl_elgamal_registry_parse; pub(crate) use self::spl::decoder_spl_elgamal_registry_parse;
/// Decodes one bounded SPL Memo instruction. /// Decodes one bounded SPL Memo instruction.
pub(crate) use self::spl::spl_memo_decode; pub(crate) use self::spl::decoder_spl_memo_decode;
/// Decodes one bounded Token-2022 instruction.
pub(crate) use self::spl::spl_token_2022_decode;
/// Returns the exact entry matching one Token-2022 tag.
pub(crate) use self::spl::spl_token_2022_entry_for_tag;
/// Returns the first byte of one retained Token-2022 payload.
pub(crate) use self::spl::spl_token_2022_payload_tag;
/// Decodes one bounded classic SPL Token instruction. /// Decodes one bounded classic SPL Token instruction.
pub(crate) use self::spl::spl_token_decode; pub(crate) use self::spl::decoder_spl_token_decode;
/// Returns the published entry matching one classic SPL Token tag. /// Returns the published entry matching one classic SPL Token tag.
pub(crate) use self::spl::spl_token_entry_for_tag; pub(crate) use self::spl::decoder_spl_token_entry_for_tag;
/// Returns the first byte of one retained classic SPL Token payload. /// Returns the first byte of one retained classic SPL Token payload.
pub(crate) use self::spl::spl_token_payload_tag; pub(crate) use self::spl::decoder_spl_token_payload_tag;
/// Decodes one bounded Token-2022 instruction.
pub(crate) use self::spl::decoder_spl_token2022_decode;
/// Returns the exact entry matching one Token-2022 tag.
pub(crate) use self::spl::decoder_spl_token2022_entry_for_tag;
/// Returns the first byte of one retained Token-2022 payload.
pub(crate) use self::spl::decoder_spl_token2022_payload_tag;
/// Current contextual core instruction input contract version.
pub use self::api::DC_API_CORE_INSTRUCTION_INPUT_CONTRACT_VERSION;
/// Stable contextual decoded observation.
pub use self::api::DcApiDecodedObservation;
/// Machine-readable decoder coverage declaration.
pub use self::api::DcApiDecoderCoverageDeclaration;
/// Declared decoder coverage entry kind.
pub use self::api::DcApiDecoderCoverageEntryKind;
/// Structured decoder diagnostic.
pub use self::api::DcApiDecoderDiagnostic;
/// Complete decoder execution result.
pub use self::api::DcApiDecoderExecutionResult;
/// Stable decoder identity.
pub use self::api::DcApiDecoderIdentity;
/// Decoder terminal result status.
pub use self::api::DcApiDecoderOutcomeStatus;
/// Explicit decoding proof.
pub use self::api::DcApiDecoderProof;
/// Decoding proof category.
pub use self::api::DcApiDecoderProofKind;
/// Deterministic decoder recognition result.
pub use self::api::DcApiDecoderRecognition;
/// Exposes the decoder support level.
pub use self::api::DcApiDecoderSupport;
/// One statically declared decoder surface.
pub use self::api::DcApiDecoderSurface;
/// Initial decoder implementation placeholder for API-level tests.
pub use self::api::DcApiInitialDecoder;
/// Contextual instruction decoder contract.
pub use self::api::DcApiInstructionDecoder;
/// Exposes the common protocol decoder trait.
pub use self::api::DcApiProtocolDecoder;
/// Computes the deterministic contextual input hash.
pub use self::api::decoder_api_decoder_api_contextual_input_hash;
/// Returns true when a decoder declares the exact program id.
pub use self::api::decoder_api_decoder_handles_program_id;
/// Computes a deterministic lowercase SHA-256 hash for one JSON value.
pub use self::api::decoder_api_deterministic_json_hash;
/// Extracts the first eight payload bytes as hexadecimal when available.
pub use self::api::decoder_api_discriminator_8_hex;
/// Exhaustive published Metaplex account-key inventory.
pub use self::metadata::DC_METADATA_MTM_METADATA_ACCOUNT_LAYOUT_AUDIT;
/// Exact decoder for the Metaplex Token Metadata program. /// Exact decoder for the Metaplex Token Metadata program.
pub use self::metadata::MetadataMetaplexTokenMetadataDecoder; pub use self::metadata::DcMetadataMetaplexTokenMetadataDecoder;
/// Canonical projection shared by Collection and Use Authority records.
pub use self::metadata::DcMetadataMtmAuthorityRecordAccountSnapshot;
/// Stable identity and policy of one canonical account snapshot.
pub use self::metadata::DcMetadataMtmCanonicalAccountIdentity;
/// Lifecycle class of one canonical account layout.
pub use self::metadata::DcMetadataMtmCanonicalAccountLifecycle;
/// Provenance retained for one canonical account observation.
pub use self::metadata::DcMetadataMtmCanonicalAccountProvenance;
/// Execution policy separated from historical materialization.
pub use self::metadata::DcMetadataMtmCanonicalExecutionPolicy;
/// Materialization policy for active or historical state.
pub use self::metadata::DcMetadataMtmCanonicalMaterializationPolicy;
/// Canonical account envelope used by materializers and replay.
pub use self::metadata::DcMetadataMtmCanonicalMetadataAccountSnapshot;
/// Typed canonical Metaplex account state.
pub use self::metadata::DcMetadataMtmCanonicalMetadataAccountState;
/// Origin of one canonical account observation.
pub use self::metadata::DcMetadataMtmCanonicalObservationSource;
/// Canonical projection shared by Metadata and Holder delegate records.
pub use self::metadata::DcMetadataMtmDelegateRecordAccountSnapshot;
/// Supported edition account layout.
pub use self::metadata::DcMetadataMtmEditionAccountKind;
/// Canonical bounded projection of one edition or master-edition account.
pub use self::metadata::DcMetadataMtmEditionAccountSnapshot;
/// Supported Edition Marker account layout.
pub use self::metadata::DcMetadataMtmEditionMarkerAccountKind;
/// Canonical bounded projection of one Edition Marker account.
pub use self::metadata::DcMetadataMtmEditionMarkerAccountSnapshot;
/// Bounded error returned while decoding a Metadata account.
pub use self::metadata::DcMetadataMtmMetadataAccountDecodeError;
/// One entry in the exhaustive published account-key audit.
pub use self::metadata::DcMetadataMtmMetadataAccountLayoutAuditEntry;
/// Canonical bounded projection of one Metadata account.
pub use self::metadata::DcMetadataMtmMetadataAccountSnapshot;
/// One bounded historical reservation entry.
pub use self::metadata::DcMetadataMtmReservationEntrySnapshot;
/// Historical Reservation List account generation.
pub use self::metadata::DcMetadataMtmReservationListAccountKind;
/// Canonical decode-only projection of a historical Reservation List account.
pub use self::metadata::DcMetadataMtmReservationListAccountSnapshot;
/// Canonical projection of one Token Owned Escrow account.
pub use self::metadata::DcMetadataMtmTokenOwnedEscrowAccountSnapshot;
/// Authority form used by one Token Owned Escrow account.
pub use self::metadata::DcMetadataMtmTokenOwnedEscrowAuthorityKind;
/// Canonical bounded projection of one programmable Token Record account.
pub use self::metadata::DcMetadataMtmTokenRecordAccountSnapshot;
/// Decodes one Collection Authority Record account.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_collection_authority_record_account;
/// Decodes and validates one edition or master-edition account snapshot.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_edition_account;
/// Decodes and validates one Edition Marker account snapshot.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_edition_marker_account;
/// Decodes one Holder Delegate Record account.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_holder_delegate_record_account;
/// Decodes and validates one canonical Metadata account snapshot.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_metadata_account;
/// Decodes one Metadata Delegate Record account.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_metadata_delegate_record_account;
/// Decodes one historical Reservation List V1 or V2 account.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_reservation_list_account;
/// Decodes one Token Owned Escrow account.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_token_owned_escrow_account;
/// Decodes and validates one programmable Token Record account snapshot.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_token_record_account;
/// Decodes one Use Authority Record account.
pub use self::metadata::decoder_metadata_metaplex_token_metadata_decode_use_authority_record_account;
/// Runtime-native Solana decoder with phased maximal native coverage.
pub use self::solana::DcSolanaCoreDecoder;
/// Exact byte length of one SPL ElGamal registry account. /// Exact byte length of one SPL ElGamal registry account.
pub use self::spl::ELGAMAL_REGISTRY_ACCOUNT_LEN; pub use self::spl::DC_SPL_ELGAMAL_REGISTRY_ACCOUNT_LEN;
/// Parsed SPL ElGamal public-key registry account.
pub use self::spl::ElGamalRegistryState;
/// Exact decoder for the SPL Associated Token Account program. /// Exact decoder for the SPL Associated Token Account program.
pub use self::spl::SplAssociatedTokenAccountDecoder; pub use self::spl::DcSplAssociatedTokenAccountDecoder;
/// Parsed SPL ElGamal public-key registry account.
pub use self::spl::DcSplElGamalRegistryState;
/// Exact decoder for the SPL ElGamal registry program. /// Exact decoder for the SPL ElGamal registry program.
pub use self::spl::SplElgamalRegistryDecoder; pub use self::spl::DcSplElgamalRegistryDecoder;
/// Exact decoder for the three registered SPL Memo generations. /// Exact decoder for the three registered SPL Memo generations.
pub use self::spl::SplMemoDecoder; pub use self::spl::DcSplMemoDecoder;
/// Exact decoder for the Token-2022 program. /// Exact decoder for the Token-2022 program.
pub use self::spl::SplToken2022Decoder; pub use self::spl::DcSplToken2022Decoder;
/// Exact decoder for the classic SPL Token program. /// Exact decoder for the classic SPL Token program.
pub use self::spl::SplTokenDecoder; pub use self::spl::DcSplTokenDecoder;
/// Parsed Token-2022 Mint, Account, or Multisig state. /// Parsed Token-2022 Mint, Account, or Multisig state.
pub use self::spl::Token2022State; pub use self::spl::DcToken2022State;
/// Exact Token-2022 base account state kind. /// Exact Token-2022 base account state kind.
pub use self::spl::Token2022StateKind; pub use self::spl::DcToken2022StateKind;
/// One exact Token-2022 TLV entry. /// One exact Token-2022 TLV entry.
pub use self::spl::Token2022TlvEntry; pub use self::spl::DcToken2022TlvEntry;
/// Parses one exact SPL ElGamal registry account. /// Parses one exact SPL ElGamal registry account.
pub use self::spl::parse_elgamal_registry_state; pub use self::spl::decoder_spl_elgamal_registry_parse_elgamal_registry_state;
/// Parses one Token-2022 Mint, Account, or Multisig state. /// Parses one Token-2022 Mint, Account, or Multisig state.
pub use self::spl::parse_token_2022_state; pub use self::spl::decoder_spl_token2022_parse_token2022_state;

View File

@@ -3,4 +3,4 @@
//! `adapter` decoder family. //! `adapter` decoder family.
pub mod saber_decimal_wrapper; mod saber_decimal_wrapper;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_adapter_saber_decimal_wrapper`. //! Migration boundary for legacy crate `kb_decoder_adapter_saber_decimal_wrapper`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_adapter_saber_decimal_wrapper"; const LEGACY_CRATE: &str = "kb_decoder_adapter_saber_decimal_wrapper";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,5 +3,5 @@
//! `admin` decoder family. //! `admin` decoder family.
pub mod jupiter_lock; mod jupiter_lock;
pub mod pump_fees; mod pump_fees;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_admin_jupiter_lock`. //! Migration boundary for legacy crate `kb_decoder_admin_jupiter_lock`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_admin_jupiter_lock"; const LEGACY_CRATE: &str = "kb_decoder_admin_jupiter_lock";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_admin_pump_fees`. //! Migration boundary for legacy crate `kb_decoder_admin_pump_fees`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_admin_pump_fees"; const LEGACY_CRATE: &str = "kb_decoder_admin_pump_fees";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,29 +3,29 @@
//! `amm` decoder family. //! `amm` decoder family.
pub mod aldrin_v1; mod aldrin_v1;
pub mod aldrin_v2; mod aldrin_v2;
pub mod alphaq; mod alphaq;
pub mod believe; mod believe;
pub mod bonk_swap; mod bonk_swap;
pub mod fluxbeam; mod fluxbeam;
pub mod goon_fi; mod goon_fi;
pub mod goosefx_gamma; mod goosefx_gamma;
pub mod goosefx_v2; mod goosefx_v2;
pub mod guac_swap; mod guac_swap;
pub mod lifinity_swap_v2; mod lifinity_swap_v2;
pub mod metadao_futarchy_amm; mod metadao_futarchy_amm;
pub mod metadao_v0_5; mod metadao_v0_5;
pub mod meteora_damm_v1; mod meteora_damm_v1;
pub mod meteora_damm_v2; mod meteora_damm_v2;
pub mod obric_v2; mod obric_v2;
pub mod one_dex; mod one_dex;
pub mod pump_swap; mod pump_swap;
pub mod raydium_lp_v4; mod raydium_lp_v4;
pub mod solfi; mod solfi;
pub mod solfi_v2; mod solfi_v2;
pub mod vertigo; mod vertigo;
pub mod virtuals; mod virtuals;
pub mod woofi; mod woofi;
pub mod zero_fi; mod zero_fi;
pub mod zora; mod zora;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_aldrin_v1`. //! Migration boundary for legacy crate `kb_decoder_amm_aldrin_v1`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_aldrin_v1"; const LEGACY_CRATE: &str = "kb_decoder_amm_aldrin_v1";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_aldrin_v2`. //! Migration boundary for legacy crate `kb_decoder_amm_aldrin_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_aldrin_v2"; const LEGACY_CRATE: &str = "kb_decoder_amm_aldrin_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_alphaq`. //! Migration boundary for legacy crate `kb_decoder_amm_alphaq`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_alphaq"; const LEGACY_CRATE: &str = "kb_decoder_amm_alphaq";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_believe`. //! Migration boundary for legacy crate `kb_decoder_amm_believe`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_believe"; const LEGACY_CRATE: &str = "kb_decoder_amm_believe";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_bonk_swap`. //! Migration boundary for legacy crate `kb_decoder_amm_bonk_swap`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_bonk_swap"; const LEGACY_CRATE: &str = "kb_decoder_amm_bonk_swap";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_fluxbeam`. //! Migration boundary for legacy crate `kb_decoder_amm_fluxbeam`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_fluxbeam"; const LEGACY_CRATE: &str = "kb_decoder_amm_fluxbeam";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_goon_fi`. //! Migration boundary for legacy crate `kb_decoder_amm_goon_fi`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_goon_fi"; const LEGACY_CRATE: &str = "kb_decoder_amm_goon_fi";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_goosefx_gamma`. //! Migration boundary for legacy crate `kb_decoder_amm_goosefx_gamma`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_goosefx_gamma"; const LEGACY_CRATE: &str = "kb_decoder_amm_goosefx_gamma";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_goosefx_v2`. //! Migration boundary for legacy crate `kb_decoder_amm_goosefx_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_goosefx_v2"; const LEGACY_CRATE: &str = "kb_decoder_amm_goosefx_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_guac_swap`. //! Migration boundary for legacy crate `kb_decoder_amm_guac_swap`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_guac_swap"; const LEGACY_CRATE: &str = "kb_decoder_amm_guac_swap";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_lifinity_swap_v2`. //! Migration boundary for legacy crate `kb_decoder_amm_lifinity_swap_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_lifinity_swap_v2"; const LEGACY_CRATE: &str = "kb_decoder_amm_lifinity_swap_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_metadao_futarchy_amm`. //! Migration boundary for legacy crate `kb_decoder_amm_metadao_futarchy_amm`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_metadao_futarchy_amm"; const LEGACY_CRATE: &str = "kb_decoder_amm_metadao_futarchy_amm";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_metadao_v0_5`. //! Migration boundary for legacy crate `kb_decoder_amm_metadao_v0_5`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_metadao_v0_5"; const LEGACY_CRATE: &str = "kb_decoder_amm_metadao_v0_5";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_meteora_damm_v1`. //! Migration boundary for legacy crate `kb_decoder_amm_meteora_damm_v1`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_meteora_damm_v1"; const LEGACY_CRATE: &str = "kb_decoder_amm_meteora_damm_v1";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_meteora_damm_v2`. //! Migration boundary for legacy crate `kb_decoder_amm_meteora_damm_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_meteora_damm_v2"; const LEGACY_CRATE: &str = "kb_decoder_amm_meteora_damm_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_obric_v2`. //! Migration boundary for legacy crate `kb_decoder_amm_obric_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_obric_v2"; const LEGACY_CRATE: &str = "kb_decoder_amm_obric_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_one_dex`. //! Migration boundary for legacy crate `kb_decoder_amm_one_dex`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_one_dex"; const LEGACY_CRATE: &str = "kb_decoder_amm_one_dex";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_pump_swap`. //! Migration boundary for legacy crate `kb_decoder_amm_pump_swap`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_pump_swap"; const LEGACY_CRATE: &str = "kb_decoder_amm_pump_swap";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_raydium_lp_v4`. //! Migration boundary for legacy crate `kb_decoder_amm_raydium_lp_v4`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_raydium_lp_v4"; const LEGACY_CRATE: &str = "kb_decoder_amm_raydium_lp_v4";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_solfi`. //! Migration boundary for legacy crate `kb_decoder_amm_solfi`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_solfi"; const LEGACY_CRATE: &str = "kb_decoder_amm_solfi";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_solfi_v2`. //! Migration boundary for legacy crate `kb_decoder_amm_solfi_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_solfi_v2"; const LEGACY_CRATE: &str = "kb_decoder_amm_solfi_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_vertigo`. //! Migration boundary for legacy crate `kb_decoder_amm_vertigo`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_vertigo"; const LEGACY_CRATE: &str = "kb_decoder_amm_vertigo";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_virtuals`. //! Migration boundary for legacy crate `kb_decoder_amm_virtuals`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_virtuals"; const LEGACY_CRATE: &str = "kb_decoder_amm_virtuals";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_woofi`. //! Migration boundary for legacy crate `kb_decoder_amm_woofi`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_woofi"; const LEGACY_CRATE: &str = "kb_decoder_amm_woofi";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_zero_fi`. //! Migration boundary for legacy crate `kb_decoder_amm_zero_fi`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_zero_fi"; const LEGACY_CRATE: &str = "kb_decoder_amm_zero_fi";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_amm_zora`. //! Migration boundary for legacy crate `kb_decoder_amm_zora`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_amm_zora"; const LEGACY_CRATE: &str = "kb_decoder_amm_zora";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,4 +3,4 @@
//! `anchor` decoder family. //! `anchor` decoder family.
pub mod core; mod core;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_anchor`. //! Migration boundary for legacy crate `kb_decoder_anchor`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_anchor"; const LEGACY_CRATE: &str = "kb_decoder_anchor";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,45 +3,46 @@
//! Decoder contracts consolidated from `kb_decoder_api`. //! Decoder contracts consolidated from `kb_decoder_api`.
pub mod contracts; mod contracts;
pub mod decoder; mod decoder;
/// Current contextual core instruction input contract version. /// Current contextual core instruction input contract version.
pub use crate::decoder::api::contracts::CORE_INSTRUCTION_INPUT_CONTRACT_VERSION; pub use self::contracts::DC_API_CORE_INSTRUCTION_INPUT_CONTRACT_VERSION;
/// Stable contextual decoded observation. /// Stable contextual decoded observation.
pub use crate::decoder::api::contracts::DecodedObservation; pub use self::contracts::DcApiDecodedObservation;
/// Machine-readable decoder coverage declaration. /// Machine-readable decoder coverage declaration.
pub use crate::decoder::api::contracts::DecoderCoverageDeclaration; pub use self::contracts::DcApiDecoderCoverageDeclaration;
/// Declared decoder coverage entry kind. /// Declared decoder coverage entry kind.
pub use crate::decoder::api::contracts::DecoderCoverageEntryKind; pub use self::contracts::DcApiDecoderCoverageEntryKind;
/// Structured decoder diagnostic. /// Structured decoder diagnostic.
pub use crate::decoder::api::contracts::DecoderDiagnostic; pub use self::contracts::DcApiDecoderDiagnostic;
/// Complete decoder execution result. /// Complete decoder execution result.
pub use crate::decoder::api::contracts::DecoderExecutionResult; pub use self::contracts::DcApiDecoderExecutionResult;
/// Stable decoder identity. /// Stable decoder identity.
pub use crate::decoder::api::contracts::DecoderIdentity; pub use self::contracts::DcApiDecoderIdentity;
/// Decoder terminal result status. /// Decoder terminal result status.
pub use crate::decoder::api::contracts::DecoderOutcomeStatus; pub use self::contracts::DcApiDecoderOutcomeStatus;
/// Explicit decoding proof. /// Explicit decoding proof.
pub use crate::decoder::api::contracts::DecoderProof; pub use self::contracts::DcApiDecoderProof;
/// Decoding proof category. /// Decoding proof category.
pub use crate::decoder::api::contracts::DecoderProofKind; pub use self::contracts::DcApiDecoderProofKind;
/// Deterministic decoder recognition result. /// Deterministic decoder recognition result.
pub use crate::decoder::api::contracts::DecoderRecognition; pub use self::contracts::DcApiDecoderRecognition;
/// One statically declared decoder surface. /// One statically declared decoder surface.
pub use crate::decoder::api::contracts::DecoderSurface; pub use self::contracts::DcApiDecoderSurface;
/// Contextual instruction decoder contract. /// Contextual instruction decoder contract.
pub use crate::decoder::api::contracts::InstructionDecoder; pub use self::contracts::DcApiInstructionDecoder;
/// Computes the deterministic contextual input hash. /// Computes the deterministic contextual input hash.
pub use crate::decoder::api::contracts::contextual_input_hash; pub use self::contracts::decoder_api_decoder_api_contextual_input_hash;
/// Returns true when a decoder declares the exact program id. /// Returns true when a decoder declares the exact program id.
pub use crate::decoder::api::contracts::decoder_handles_program_id; pub use self::contracts::decoder_api_decoder_handles_program_id;
/// Computes a deterministic lowercase SHA-256 hash for one JSON value. /// Computes a deterministic lowercase SHA-256 hash for one JSON value.
pub use crate::decoder::api::contracts::deterministic_json_hash; pub use self::contracts::decoder_api_deterministic_json_hash;
/// Extracts the first eight payload bytes as hexadecimal when available. /// Extracts the first eight payload bytes as hexadecimal when available.
pub use crate::decoder::api::contracts::discriminator_8_hex; pub use self::contracts::decoder_api_discriminator_8_hex;
/// Exposes the decoder support level. /// Exposes the decoder support level.
pub use crate::decoder::api::decoder::DecoderSupport; pub use self::decoder::DcApiDecoderSupport;
/// Initial decoder implementation placeholder for API-level tests. /// Initial decoder implementation placeholder for API-level tests.
pub use crate::decoder::api::decoder::InitialDecoder; pub use self::decoder::DcApiInitialDecoder;
/// Exposes the common protocol decoder trait. /// Exposes the common protocol decoder trait.
pub use crate::decoder::api::decoder::ProtocolDecoder; pub use self::decoder::DcApiProtocolDecoder;

View File

@@ -6,18 +6,19 @@
use sha2::Digest; // rust-rules: trait-import use sha2::Digest; // rust-rules: trait-import
/// Current contextual core instruction input contract version. /// Current contextual core instruction input contract version.
pub const CORE_INSTRUCTION_INPUT_CONTRACT_VERSION: u32 = crate::CORE_REPLAY_INPUT_CONTRACT_VERSION; pub const DC_API_CORE_INSTRUCTION_INPUT_CONTRACT_VERSION: u32 =
crate::MD_CORE_REPLAY_INPUT_CONTRACT_VERSION;
/// Stable identity of one contextual instruction decoder. /// Stable identity of one contextual instruction decoder.
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct DecoderIdentity { pub struct DcApiDecoderIdentity {
/// Stable lower snake case processor name. /// Stable lower snake case processor name.
pub name: std::string::String, pub name: std::string::String,
/// Semantic or deterministic implementation version. /// Semantic or deterministic implementation version.
pub version: std::string::String, pub version: std::string::String,
} }
impl DecoderIdentity { impl DcApiDecoderIdentity {
/// Builds a validated decoder identity. /// Builds a validated decoder identity.
pub fn new( pub fn new(
name: impl std::convert::Into<std::string::String>, name: impl std::convert::Into<std::string::String>,
@@ -38,7 +39,7 @@ impl DecoderIdentity {
/// One statically declared Solana surface supported by a decoder. /// One statically declared Solana surface supported by a decoder.
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct DecoderSurface { pub struct DcApiDecoderSurface {
/// Exact Solana program identifier. /// Exact Solana program identifier.
pub program_id: &'static str, pub program_id: &'static str,
/// Stable surface code. /// Stable surface code.
@@ -49,7 +50,7 @@ pub struct DecoderSurface {
/// Declared decoder coverage entry kind. /// Declared decoder coverage entry kind.
#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub enum DecoderCoverageEntryKind { pub enum DcApiDecoderCoverageEntryKind {
/// Program instruction entry. /// Program instruction entry.
Instruction, Instruction,
/// Program event entry. /// Program event entry.
@@ -60,13 +61,13 @@ pub enum DecoderCoverageEntryKind {
/// Machine-readable decoder coverage declaration. /// Machine-readable decoder coverage declaration.
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct DecoderCoverageDeclaration { pub struct DcApiDecoderCoverageDeclaration {
/// Solana program identifier. /// Solana program identifier.
pub program_id: std::string::String, pub program_id: std::string::String,
/// Optional stable surface code. /// Optional stable surface code.
pub surface_code: std::option::Option<std::string::String>, pub surface_code: std::option::Option<std::string::String>,
/// Entry kind. /// Entry kind.
pub entry_kind: DecoderCoverageEntryKind, pub entry_kind: DcApiDecoderCoverageEntryKind,
/// Stable instruction, event or discriminator code. /// Stable instruction, event or discriminator code.
pub entry_code: std::string::String, pub entry_code: std::string::String,
/// Optional normalized lowercase hexadecimal discriminator. /// Optional normalized lowercase hexadecimal discriminator.
@@ -75,12 +76,12 @@ pub struct DecoderCoverageDeclaration {
pub historical: bool, pub historical: bool,
} }
impl DecoderCoverageDeclaration { impl DcApiDecoderCoverageDeclaration {
/// Builds a validated coverage declaration. /// Builds a validated coverage declaration.
pub fn new( pub fn new(
program_id: impl std::convert::Into<std::string::String>, program_id: impl std::convert::Into<std::string::String>,
surface_code: std::option::Option<std::string::String>, surface_code: std::option::Option<std::string::String>,
entry_kind: DecoderCoverageEntryKind, entry_kind: DcApiDecoderCoverageEntryKind,
entry_code: impl std::convert::Into<std::string::String>, entry_code: impl std::convert::Into<std::string::String>,
discriminator_hex: std::option::Option<std::string::String>, discriminator_hex: std::option::Option<std::string::String>,
historical: bool, historical: bool,
@@ -122,7 +123,7 @@ impl DecoderCoverageDeclaration {
/// Deterministic recognition result used by dispatch. /// Deterministic recognition result used by dispatch.
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct DecoderRecognition { pub struct DcApiDecoderRecognition {
/// Whether the decoder is compatible with the input. /// Whether the decoder is compatible with the input.
pub compatible: bool, pub compatible: bool,
/// Whether recognition is exact rather than program-only. /// Whether recognition is exact rather than program-only.
@@ -137,7 +138,7 @@ pub struct DecoderRecognition {
pub discriminator_hex: std::option::Option<std::string::String>, pub discriminator_hex: std::option::Option<std::string::String>,
} }
impl DecoderRecognition { impl DcApiDecoderRecognition {
/// Builds a non-compatible recognition result. /// Builds a non-compatible recognition result.
pub fn incompatible() -> Self { pub fn incompatible() -> Self {
return Self { return Self {
@@ -171,7 +172,7 @@ impl DecoderRecognition {
/// Decoder terminal result status. /// Decoder terminal result status.
#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub enum DecoderOutcomeStatus { pub enum DcApiDecoderOutcomeStatus {
/// At least one stable decoded observation was produced. /// At least one stable decoded observation was produced.
Decoded, Decoded,
/// The decoder intentionally ignored a recognized input. /// The decoder intentionally ignored a recognized input.
@@ -184,7 +185,7 @@ pub enum DecoderOutcomeStatus {
/// Proof category attached to one decoded observation. /// Proof category attached to one decoded observation.
#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub enum DecoderProofKind { pub enum DcApiDecoderProofKind {
/// Exact instruction discriminator match. /// Exact instruction discriminator match.
ExactDiscriminator, ExactDiscriminator,
/// Exact binary layout decode. /// Exact binary layout decode.
@@ -207,18 +208,18 @@ pub enum DecoderProofKind {
/// Explicit proof attached to one decoded observation. /// Explicit proof attached to one decoded observation.
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct DecoderProof { pub struct DcApiDecoderProof {
/// Proof category. /// Proof category.
pub kind: DecoderProofKind, pub kind: DcApiDecoderProofKind,
/// Decoder confidence. /// Decoder confidence.
pub confidence: crate::DecoderConfidence, pub confidence: crate::MdDecoderConfidence,
/// Stable evidence strings, hashes or classifier codes. /// Stable evidence strings, hashes or classifier codes.
pub evidence: std::vec::Vec<std::string::String>, pub evidence: std::vec::Vec<std::string::String>,
} }
/// Structured decoder diagnostic without third-party error wrappers. /// Structured decoder diagnostic without third-party error wrappers.
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct DecoderDiagnostic { pub struct DcApiDecoderDiagnostic {
/// Stable machine-readable diagnostic code. /// Stable machine-readable diagnostic code.
pub code: std::string::String, pub code: std::string::String,
/// Human-readable diagnostic message. /// Human-readable diagnostic message.
@@ -227,7 +228,7 @@ pub struct DecoderDiagnostic {
pub retriable: bool, pub retriable: bool,
} }
impl DecoderDiagnostic { impl DcApiDecoderDiagnostic {
/// Builds a validated decoder diagnostic. /// Builds a validated decoder diagnostic.
pub fn new( pub fn new(
code: impl std::convert::Into<std::string::String>, code: impl std::convert::Into<std::string::String>,
@@ -250,11 +251,11 @@ impl DecoderDiagnostic {
/// Stable contextual decoded observation persisted by the decode pipeline. /// Stable contextual decoded observation persisted by the decode pipeline.
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct DecodedObservation { pub struct DcApiDecodedObservation {
/// Stable processor-owned event key within one input. /// Stable processor-owned event key within one input.
pub event_key: std::string::String, pub event_key: std::string::String,
/// Shared typed protocol event identity. /// Shared typed protocol event identity.
pub event: crate::DecodedProtocolEvent, pub event: crate::MdDecodedProtocolEvent,
/// Typed event payload serialized as deterministic JSON. /// Typed event payload serialized as deterministic JSON.
pub payload_json: serde_json::Value, pub payload_json: serde_json::Value,
/// Whether the source transaction failed on-chain. /// Whether the source transaction failed on-chain.
@@ -264,10 +265,10 @@ pub struct DecodedObservation {
/// Whether the observed state mutation was committed on-chain. /// Whether the observed state mutation was committed on-chain.
pub observation_committed: bool, pub observation_committed: bool,
/// Explicit decoding proof. /// Explicit decoding proof.
pub proof: DecoderProof, pub proof: DcApiDecoderProof,
} }
impl DecodedObservation { impl DcApiDecodedObservation {
/// Validates failed transaction commit semantics and stable identity fields. /// Validates failed transaction commit semantics and stable identity fields.
pub fn validate(&self) -> kb_core::Result<()> { pub fn validate(&self) -> kb_core::Result<()> {
if self.event_key.trim().is_empty() { if self.event_key.trim().is_empty() {
@@ -295,22 +296,22 @@ impl DecodedObservation {
/// Complete explicit result produced by one decoder invocation. /// Complete explicit result produced by one decoder invocation.
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct DecoderExecutionResult { pub struct DcApiDecoderExecutionResult {
/// Terminal decoder status. /// Terminal decoder status.
pub status: DecoderOutcomeStatus, pub status: DcApiDecoderOutcomeStatus,
/// Optional recognized instruction or discriminator code. /// Optional recognized instruction or discriminator code.
pub recognized_entry_code: std::option::Option<std::string::String>, pub recognized_entry_code: std::option::Option<std::string::String>,
/// Decoded observations. /// Decoded observations.
pub observations: std::vec::Vec<DecodedObservation>, pub observations: std::vec::Vec<DcApiDecodedObservation>,
/// Structured diagnostics. /// Structured diagnostics.
pub diagnostics: std::vec::Vec<DecoderDiagnostic>, pub diagnostics: std::vec::Vec<DcApiDecoderDiagnostic>,
} }
impl DecoderExecutionResult { impl DcApiDecoderExecutionResult {
/// Builds an unsupported result with no false decoded observation. /// Builds an unsupported result with no false decoded observation.
pub fn unsupported(entry_code: std::option::Option<std::string::String>) -> Self { pub fn unsupported(entry_code: std::option::Option<std::string::String>) -> Self {
return Self { return Self {
status: DecoderOutcomeStatus::Unsupported, status: DcApiDecoderOutcomeStatus::Unsupported,
recognized_entry_code: entry_code, recognized_entry_code: entry_code,
observations: std::vec::Vec::new(), observations: std::vec::Vec::new(),
diagnostics: std::vec::Vec::new(), diagnostics: std::vec::Vec::new(),
@@ -320,7 +321,7 @@ impl DecoderExecutionResult {
/// Builds an ignored result. /// Builds an ignored result.
pub fn ignored(entry_code: std::option::Option<std::string::String>) -> Self { pub fn ignored(entry_code: std::option::Option<std::string::String>) -> Self {
return Self { return Self {
status: DecoderOutcomeStatus::Ignored, status: DcApiDecoderOutcomeStatus::Ignored,
recognized_entry_code: entry_code, recognized_entry_code: entry_code,
observations: std::vec::Vec::new(), observations: std::vec::Vec::new(),
diagnostics: std::vec::Vec::new(), diagnostics: std::vec::Vec::new(),
@@ -329,17 +330,17 @@ impl DecoderExecutionResult {
/// Validates status and observation consistency. /// Validates status and observation consistency.
pub fn validate(&self) -> kb_core::Result<()> { pub fn validate(&self) -> kb_core::Result<()> {
if self.status == DecoderOutcomeStatus::Decoded && self.observations.is_empty() { if self.status == DcApiDecoderOutcomeStatus::Decoded && self.observations.is_empty() {
return std::result::Result::Err(kb_core::Error::invalid_state( return std::result::Result::Err(kb_core::Error::invalid_state(
"decoded status requires at least one observation", "decoded status requires at least one observation",
)); ));
} }
if self.status != DecoderOutcomeStatus::Decoded && !self.observations.is_empty() { if self.status != DcApiDecoderOutcomeStatus::Decoded && !self.observations.is_empty() {
return std::result::Result::Err(kb_core::Error::invalid_state( return std::result::Result::Err(kb_core::Error::invalid_state(
"non-decoded status must not contain observations", "non-decoded status must not contain observations",
)); ));
} }
if self.status == DecoderOutcomeStatus::Failed && self.diagnostics.is_empty() { if self.status == DcApiDecoderOutcomeStatus::Failed && self.diagnostics.is_empty() {
return std::result::Result::Err(kb_core::Error::invalid_state( return std::result::Result::Err(kb_core::Error::invalid_state(
"failed decoder status requires at least one diagnostic", "failed decoder status requires at least one diagnostic",
)); ));
@@ -355,21 +356,24 @@ impl DecoderExecutionResult {
} }
/// Contextual instruction decoder contract used by the common pipeline. /// Contextual instruction decoder contract used by the common pipeline.
pub trait InstructionDecoder: std::marker::Send + std::marker::Sync { pub trait DcApiInstructionDecoder: std::marker::Send + std::marker::Sync {
/// Returns the stable decoder identity. /// Returns the stable decoder identity.
fn identity(&self) -> DecoderIdentity; fn identity(&self) -> DcApiDecoderIdentity;
/// Returns every exact Solana surface supported by the decoder. /// Returns every exact Solana surface supported by the decoder.
fn surfaces(&self) -> &'static [DecoderSurface]; fn surfaces(&self) -> &'static [DcApiDecoderSurface];
/// Returns the machine-readable declared coverage matrix. /// Returns the machine-readable declared coverage matrix.
fn coverage(&self) -> std::vec::Vec<DecoderCoverageDeclaration>; fn coverage(&self) -> std::vec::Vec<DcApiDecoderCoverageDeclaration>;
/// Recognizes one contextual core instruction for deterministic dispatch. /// Recognizes one contextual core instruction for deterministic dispatch.
fn recognize(&self, input: &crate::CoreInstructionReplayInput) -> DecoderRecognition; fn recognize(&self, input: &crate::MdCoreInstructionReplayInput) -> DcApiDecoderRecognition;
/// Decodes one recognized contextual core instruction. /// Decodes one recognized contextual core instruction.
fn decode(&self, input: &crate::CoreInstructionReplayInput) -> DecoderExecutionResult; fn decode(&self, input: &crate::MdCoreInstructionReplayInput) -> DcApiDecoderExecutionResult;
} }
/// Returns true when a decoder declares the exact program id. /// Returns true when a decoder declares the exact program id.
pub fn decoder_handles_program_id(decoder: &dyn InstructionDecoder, program_id: &str) -> bool { pub fn decoder_api_decoder_handles_program_id(
decoder: &dyn DcApiInstructionDecoder,
program_id: &str,
) -> bool {
for surface in decoder.surfaces() { for surface in decoder.surfaces() {
if surface.program_id == program_id { if surface.program_id == program_id {
return true; return true;
@@ -379,8 +383,8 @@ pub fn decoder_handles_program_id(decoder: &dyn InstructionDecoder, program_id:
} }
/// Computes a deterministic lowercase SHA-256 hash for one contextual input. /// Computes a deterministic lowercase SHA-256 hash for one contextual input.
pub fn contextual_input_hash( pub fn decoder_api_decoder_api_contextual_input_hash(
input: &crate::CoreInstructionReplayInput, input: &crate::MdCoreInstructionReplayInput,
) -> kb_core::Result<std::string::String> { ) -> kb_core::Result<std::string::String> {
let serialization_result = serde_json::to_value(input); let serialization_result = serde_json::to_value(input);
let mut value = match serialization_result { let mut value = match serialization_result {
@@ -391,11 +395,11 @@ pub fn contextual_input_hash(
))); )));
}, },
}; };
return crate::deterministic_json_hash(&mut value); return crate::decoder_api_deterministic_json_hash(&mut value);
} }
/// Computes a deterministic lowercase SHA-256 hash for one JSON value. /// Computes a deterministic lowercase SHA-256 hash for one JSON value.
pub fn deterministic_json_hash( pub fn decoder_api_deterministic_json_hash(
value: &mut serde_json::Value, value: &mut serde_json::Value,
) -> kb_core::Result<std::string::String> { ) -> kb_core::Result<std::string::String> {
sort_json_value(value); sort_json_value(value);
@@ -417,8 +421,8 @@ pub fn deterministic_json_hash(
} }
/// Extracts the first eight payload bytes as normalized lowercase hexadecimal when available. /// Extracts the first eight payload bytes as normalized lowercase hexadecimal when available.
pub fn discriminator_8_hex( pub fn decoder_api_discriminator_8_hex(
input: &crate::CoreInstructionReplayInput, input: &crate::MdCoreInstructionReplayInput,
) -> std::option::Option<std::string::String> { ) -> std::option::Option<std::string::String> {
let payload = match &input.instruction_payload_json { let payload = match &input.instruction_payload_json {
std::option::Option::Some(value) => value, std::option::Option::Some(value) => value,
@@ -465,8 +469,8 @@ fn sort_json_value(value: &mut serde_json::Value) {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
fn replay_input() -> crate::CoreInstructionReplayInput { fn replay_input() -> crate::MdCoreInstructionReplayInput {
let result = crate::CoreInstructionReplayInput::new( let result = crate::MdCoreInstructionReplayInput::new(
"signature:0", "signature:0",
"signature", "signature",
42, 42,
@@ -497,8 +501,8 @@ mod tests {
#[test] #[test]
fn contextual_input_hash_is_stable() { fn contextual_input_hash_is_stable() {
let first = crate::contextual_input_hash(&replay_input()); let first = crate::decoder_api_decoder_api_contextual_input_hash(&replay_input());
let second = crate::contextual_input_hash(&replay_input()); let second = crate::decoder_api_decoder_api_contextual_input_hash(&replay_input());
assert!(first.is_ok()); assert!(first.is_ok());
assert_eq!(first, second); assert_eq!(first, second);
} }
@@ -514,8 +518,8 @@ mod tests {
"payloadJson": {"dataBase64": "CAcGBQQDAgE="}, "payloadJson": {"dataBase64": "CAcGBQQDAgE="},
"payloadHash": "different-payload-hash" "payloadHash": "different-payload-hash"
}]); }]);
let first_hash = crate::contextual_input_hash(&first); let first_hash = crate::decoder_api_decoder_api_contextual_input_hash(&first);
let second_hash = crate::contextual_input_hash(&second); let second_hash = crate::decoder_api_decoder_api_contextual_input_hash(&second);
assert!(first_hash.is_ok()); assert!(first_hash.is_ok());
assert!(second_hash.is_ok()); assert!(second_hash.is_ok());
assert_ne!(first_hash, second_hash); assert_ne!(first_hash, second_hash);
@@ -538,26 +542,26 @@ mod tests {
#[test] #[test]
fn discriminator_uses_first_eight_bytes() { fn discriminator_uses_first_eight_bytes() {
let value = crate::discriminator_8_hex(&replay_input()); let value = crate::decoder_api_discriminator_8_hex(&replay_input());
assert_eq!(value.as_deref(), std::option::Option::Some("0102030405060708")); assert_eq!(value.as_deref(), std::option::Option::Some("0102030405060708"));
} }
#[test] #[test]
fn failed_observation_cannot_be_committed() { fn failed_observation_cannot_be_committed() {
let observation = crate::DecodedObservation { let observation = crate::DcApiDecodedObservation {
event_key: "event".to_string(), event_key: "event".to_string(),
event: crate::DecodedProtocolEvent { event: crate::MdDecodedProtocolEvent {
signature: crate::Signature("signature".to_string()), signature: crate::MdSignature("signature".to_string()),
slot: crate::Slot(42), slot: crate::MdSlot(42),
instruction_path: crate::InstructionPath("0".to_string()), instruction_path: crate::MdInstructionPath("0".to_string()),
program_id: crate::ProgramId("program".to_string()), program_id: crate::MdProgramId("program".to_string()),
protocol_code: crate::ProtocolCode("solana".to_string()), protocol_code: crate::MdProtocolCode("solana".to_string()),
surface_code: crate::SurfaceCode("system_program".to_string()), surface_code: crate::MdSurfaceCode("system_program".to_string()),
event_code: crate::EventCode("system_program.attempt".to_string()), event_code: crate::MdEventCode("system_program.attempt".to_string()),
event_name: crate::EventName("attempt".to_string()), event_name: crate::MdEventName("attempt".to_string()),
event_family: crate::EventFamily::Audit, event_family: crate::MdEventFamily::Audit,
source_kind: crate::EventSourceKind::Instruction, source_kind: crate::MdEventSourceKind::Instruction,
confidence: crate::DecoderConfidence::Exact, confidence: crate::MdDecoderConfidence::Exact,
}, },
payload_json: serde_json::json!({}), payload_json: serde_json::json!({}),
transaction_failed: true, transaction_failed: true,
@@ -565,9 +569,9 @@ mod tests {
serde_json::json!({"InstructionError": [0, "Custom"]}), serde_json::json!({"InstructionError": [0, "Custom"]}),
), ),
observation_committed: true, observation_committed: true,
proof: crate::DecoderProof { proof: crate::DcApiDecoderProof {
kind: crate::DecoderProofKind::ExactLayout, kind: crate::DcApiDecoderProofKind::ExactLayout,
confidence: crate::DecoderConfidence::Exact, confidence: crate::MdDecoderConfidence::Exact,
evidence: std::vec!["layout".to_string()], evidence: std::vec!["layout".to_string()],
}, },
}; };

View File

@@ -5,7 +5,7 @@
/// Decoder support level for a program observation. /// Decoder support level for a program observation.
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum DecoderSupport { pub enum DcApiDecoderSupport {
/// The decoder does not support the observation. /// The decoder does not support the observation.
No, No,
/// The decoder may support the observation after deeper inspection. /// The decoder may support the observation after deeper inspection.
@@ -15,7 +15,7 @@ pub enum DecoderSupport {
} }
/// Common trait implemented by every protocol decoder crate. /// Common trait implemented by every protocol decoder crate.
pub trait ProtocolDecoder { pub trait DcApiProtocolDecoder {
/// Returns the stable decoder name. /// Returns the stable decoder name.
fn decoder_name(&self) -> &'static str; fn decoder_name(&self) -> &'static str;
/// Returns the decoder implementation version. /// Returns the decoder implementation version.
@@ -23,7 +23,7 @@ pub trait ProtocolDecoder {
/// Returns the Solana program ids handled by this decoder. /// Returns the Solana program ids handled by this decoder.
fn program_ids(&self) -> &'static [&'static str]; fn program_ids(&self) -> &'static [&'static str];
/// Checks whether the decoder handles a program id. /// Checks whether the decoder handles a program id.
fn handles_program_id(&self, program_id: &crate::ProgramId) -> bool { fn handles_program_id(&self, program_id: &crate::MdProgramId) -> bool {
for candidate in self.program_ids() { for candidate in self.program_ids() {
if program_id.0.as_str() == *candidate { if program_id.0.as_str() == *candidate {
return true; return true;
@@ -32,19 +32,22 @@ pub trait ProtocolDecoder {
return false; return false;
} }
/// Checks whether the decoder supports a generic program observation. /// Checks whether the decoder supports a generic program observation.
fn supports_observation(&self, observation: &crate::ProgramObservation) -> DecoderSupport; fn supports_observation(
&self,
observation: &crate::MdProgramObservation,
) -> DcApiDecoderSupport;
/// Decodes a generic program observation into protocol events. /// Decodes a generic program observation into protocol events.
fn decode_observation( fn decode_observation(
&self, &self,
observation: &crate::ProgramObservation, observation: &crate::MdProgramObservation,
) -> kb_core::Result<std::vec::Vec<crate::DecodedProtocolEvent>>; ) -> kb_core::Result<std::vec::Vec<crate::MdDecodedProtocolEvent>>;
} }
/// Initial decoder implementation placeholder for API-level tests. /// Initial decoder implementation placeholder for API-level tests.
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
pub struct InitialDecoder; pub struct DcApiInitialDecoder;
impl ProtocolDecoder for InitialDecoder { impl DcApiProtocolDecoder for DcApiInitialDecoder {
fn decoder_name(&self) -> &'static str { fn decoder_name(&self) -> &'static str {
return "kb_decoder_api"; return "kb_decoder_api";
} }
@@ -57,17 +60,20 @@ impl ProtocolDecoder for InitialDecoder {
return &[]; return &[];
} }
fn supports_observation(&self, observation: &crate::ProgramObservation) -> DecoderSupport { fn supports_observation(
if ProtocolDecoder::handles_program_id(self, &observation.program_id) { &self,
return DecoderSupport::Maybe; observation: &crate::MdProgramObservation,
) -> DcApiDecoderSupport {
if DcApiProtocolDecoder::handles_program_id(self, &observation.program_id) {
return DcApiDecoderSupport::Maybe;
} }
return DecoderSupport::No; return DcApiDecoderSupport::No;
} }
fn decode_observation( fn decode_observation(
&self, &self,
_observation: &crate::ProgramObservation, _observation: &crate::MdProgramObservation,
) -> kb_core::Result<std::vec::Vec<crate::DecodedProtocolEvent>> { ) -> kb_core::Result<std::vec::Vec<crate::MdDecodedProtocolEvent>> {
return std::result::Result::Ok(std::vec::Vec::new()); return std::result::Result::Ok(std::vec::Vec::new());
} }
} }

View File

@@ -3,7 +3,7 @@
//! `bridge` decoder family. //! `bridge` decoder family.
pub mod circle_cctp_token_messenger_minter; mod circle_cctp_token_messenger_minter;
pub mod circle_cctp_token_messenger_minter_v2; mod circle_cctp_token_messenger_minter_v2;
pub mod layer_zero_endpoint; mod layer_zero_endpoint;
pub mod layer_zero_executor; mod layer_zero_executor;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_bridge_circle_cctp_token_messenger_minter`. //! Migration boundary for legacy crate `kb_decoder_bridge_circle_cctp_token_messenger_minter`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_bridge_circle_cctp_token_messenger_minter"; const LEGACY_CRATE: &str = "kb_decoder_bridge_circle_cctp_token_messenger_minter";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_bridge_circle_cctp_token_messenger_minter_v2`. //! Migration boundary for legacy crate `kb_decoder_bridge_circle_cctp_token_messenger_minter_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_bridge_circle_cctp_token_messenger_minter_v2"; const LEGACY_CRATE: &str = "kb_decoder_bridge_circle_cctp_token_messenger_minter_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_bridge_layer_zero_endpoint`. //! Migration boundary for legacy crate `kb_decoder_bridge_layer_zero_endpoint`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_bridge_layer_zero_endpoint"; const LEGACY_CRATE: &str = "kb_decoder_bridge_layer_zero_endpoint";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_bridge_layer_zero_executor`. //! Migration boundary for legacy crate `kb_decoder_bridge_layer_zero_executor`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_bridge_layer_zero_executor"; const LEGACY_CRATE: &str = "kb_decoder_bridge_layer_zero_executor";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,9 +3,9 @@
//! `clmm` decoder family. //! `clmm` decoder family.
pub mod byreal; mod byreal;
pub mod fusion; mod fusion;
pub mod orca_whirlpool; mod orca_whirlpool;
pub mod pancake_swap; mod pancake_swap;
pub mod raydium; mod raydium;
pub mod stabble; mod stabble;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_clmm_byreal`. //! Migration boundary for legacy crate `kb_decoder_clmm_byreal`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_clmm_byreal"; const LEGACY_CRATE: &str = "kb_decoder_clmm_byreal";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_clmm_fusion`. //! Migration boundary for legacy crate `kb_decoder_clmm_fusion`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_clmm_fusion"; const LEGACY_CRATE: &str = "kb_decoder_clmm_fusion";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_clmm_orca_whirlpool`. //! Migration boundary for legacy crate `kb_decoder_clmm_orca_whirlpool`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_clmm_orca_whirlpool"; const LEGACY_CRATE: &str = "kb_decoder_clmm_orca_whirlpool";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_clmm_pancake_swap`. //! Migration boundary for legacy crate `kb_decoder_clmm_pancake_swap`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_clmm_pancake_swap"; const LEGACY_CRATE: &str = "kb_decoder_clmm_pancake_swap";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_clmm_raydium`. //! Migration boundary for legacy crate `kb_decoder_clmm_raydium`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_clmm_raydium"; const LEGACY_CRATE: &str = "kb_decoder_clmm_raydium";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_clmm_stabble`. //! Migration boundary for legacy crate `kb_decoder_clmm_stabble`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_clmm_stabble"; const LEGACY_CRATE: &str = "kb_decoder_clmm_stabble";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,4 +3,4 @@
//! `cpmm` decoder family. //! `cpmm` decoder family.
pub mod raydium; mod raydium;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_cpmm_raydium`. //! Migration boundary for legacy crate `kb_decoder_cpmm_raydium`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_cpmm_raydium"; const LEGACY_CRATE: &str = "kb_decoder_cpmm_raydium";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,4 +3,4 @@
//! `dlmm` decoder family. //! `dlmm` decoder family.
pub mod meteora; mod meteora;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_dlmm_meteora`. //! Migration boundary for legacy crate `kb_decoder_dlmm_meteora`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_dlmm_meteora"; const LEGACY_CRATE: &str = "kb_decoder_dlmm_meteora";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,5 +3,5 @@
//! `fees` decoder family. //! `fees` decoder family.
pub mod bags_fee_share_v1; mod bags_fee_share_v1;
pub mod bags_fee_share_v2; mod bags_fee_share_v2;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_fees_bags_fee_share_v1`. //! Migration boundary for legacy crate `kb_decoder_fees_bags_fee_share_v1`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_fees_bags_fee_share_v1"; const LEGACY_CRATE: &str = "kb_decoder_fees_bags_fee_share_v1";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_fees_bags_fee_share_v2`. //! Migration boundary for legacy crate `kb_decoder_fees_bags_fee_share_v2`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_fees_bags_fee_share_v2"; const LEGACY_CRATE: &str = "kb_decoder_fees_bags_fee_share_v2";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,4 +3,4 @@
//! `governance` decoder family. //! `governance` decoder family.
pub mod metadao_bid_wall; mod metadao_bid_wall;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_governance_metadao_bid_wall`. //! Migration boundary for legacy crate `kb_decoder_governance_metadao_bid_wall`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_governance_metadao_bid_wall"; const LEGACY_CRATE: &str = "kb_decoder_governance_metadao_bid_wall";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,12 +3,12 @@
//! `launchpad` decoder family. //! `launchpad` decoder family.
pub mod boop_fun; mod boop_fun;
pub mod metadao_ico; mod metadao_ico;
pub mod meteora_dbc; mod meteora_dbc;
pub mod moonit; mod moonit;
pub mod orca_wavebreak; mod orca_wavebreak;
pub mod printr; mod printr;
pub mod pump_fun; mod pump_fun;
pub mod pump_pumpup_ai; mod pump_pumpup_ai;
pub mod raydium_launchlab; mod raydium_launchlab;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_boop_fun`. //! Migration boundary for legacy crate `kb_decoder_launchpad_boop_fun`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_boop_fun"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_boop_fun";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_metadao_ico`. //! Migration boundary for legacy crate `kb_decoder_launchpad_metadao_ico`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_metadao_ico"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_metadao_ico";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_meteora_dbc`. //! Migration boundary for legacy crate `kb_decoder_launchpad_meteora_dbc`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_meteora_dbc"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_meteora_dbc";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_moonit`. //! Migration boundary for legacy crate `kb_decoder_launchpad_moonit`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_moonit"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_moonit";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_orca_wavebreak`. //! Migration boundary for legacy crate `kb_decoder_launchpad_orca_wavebreak`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_orca_wavebreak"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_orca_wavebreak";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_printr`. //! Migration boundary for legacy crate `kb_decoder_launchpad_printr`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_printr"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_printr";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_pump_fun`. //! Migration boundary for legacy crate `kb_decoder_launchpad_pump_fun`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_pump_fun"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_pump_fun";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_pump_pumpup_ai`. //! Migration boundary for legacy crate `kb_decoder_launchpad_pump_pumpup_ai`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_pump_pumpup_ai"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_pump_pumpup_ai";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_launchpad_raydium_launchlab`. //! Migration boundary for legacy crate `kb_decoder_launchpad_raydium_launchlab`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_launchpad_raydium_launchlab"; const LEGACY_CRATE: &str = "kb_decoder_launchpad_raydium_launchlab";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

View File

@@ -3,10 +3,10 @@
//! `lending` decoder family. //! `lending` decoder family.
pub mod clone; mod clone;
pub mod jupiter_lend_borrow; mod jupiter_lend_borrow;
pub mod jupiter_lend_earn; mod jupiter_lend_earn;
pub mod jupiter_lend_flash_loan; mod jupiter_lend_flash_loan;
pub mod jupiter_lend_liquidity; mod jupiter_lend_liquidity;
pub mod kamino; mod kamino;
pub mod marginfi_v2; mod marginfi_v2;

View File

@@ -4,7 +4,7 @@
//! Migration boundary for legacy crate `kb_decoder_lending_clone`. //! Migration boundary for legacy crate `kb_decoder_lending_clone`.
/// Legacy crate name retained for migration and compatibility tracking. /// Legacy crate name retained for migration and compatibility tracking.
pub const LEGACY_CRATE: &str = "kb_decoder_lending_clone"; const LEGACY_CRATE: &str = "kb_decoder_lending_clone";
/// Current porting status. /// Current porting status.
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port"; const MIGRATION_STATUS: &str = "source-preserved-pending-port";

Some files were not shown because too many files have changed in this diff Show More