v0.1.0-pre.011
This commit is contained in:
5
.pydevproject
Normal file
5
.pydevproject
Normal 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>
|
||||
10
CHANGELOG.md
10
CHANGELOG.md
@@ -1,3 +1,6 @@
|
||||
<!-- file: CHANGELOG.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# CHANGELOG
|
||||
|
||||
## 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_materializer_api` dans `kb-lib::materializer::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.
|
||||
|
||||
## 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.
|
||||
|
||||
22
README.md
22
README.md
@@ -1,5 +1,5 @@
|
||||
<!-- file: README.md -->
|
||||
<!-- version: 7 -->
|
||||
<!-- version: 8 -->
|
||||
|
||||
# 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` :
|
||||
|
||||
- `LifecycleMaterializer` 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 Token‑2022 et registre ElGamal ;
|
||||
- `ComplianceAuditMaterializer` pour les écritures et copies bornées de bytecode ;
|
||||
- `StakingMaterializer` pour les transitions Stake et Vote commitées.
|
||||
- `MtLifecycleMaterializer` pour les comptes System, nonces, ALT, loaders, Feature Gate, contextes ZK et rapports Slashing ;
|
||||
- `MtAdminMaterializer` pour les assignations, configurations et autorités, avec ses projections stateful Token‑2022 et registre ElGamal ;
|
||||
- `MtComplianceAuditMaterializer` pour les écritures et copies bornées de bytecode ;
|
||||
- `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 d’entrée et ses résultats restent réexportés à la racine de `kb-lib`, afin qu’un futur crate externe puisse fournir un matérialiseur sans dépendre d’une 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 d’entrée et ses résultats restent réexportés à la racine de `kb-lib`, afin qu’un futur crate externe puisse fournir un matérialiseur sans dépendre d’une 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 Token‑2022 ;
|
||||
- `MtFeesMaterializer` pour les frais publics et confidentiels Token‑2022, 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 Token‑2022 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 d’extension `DcApiProtocolDecoder`, `MtApiEventMaterializer` et `ExApiInstructionExecutor`.
|
||||
|
||||
31
ROADMAP.md
31
ROADMAP.md
@@ -1,5 +1,5 @@
|
||||
<!-- file: ROADMAP.md -->
|
||||
<!-- version: 8 -->
|
||||
<!-- version: 9 -->
|
||||
|
||||
# ROADMAP — khadhroony-bot3
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
- [x] Porter exactement les contrats publics de `kb_decoder_api`.
|
||||
- [x] Porter exactement les contrats publics des APIs d’exécution et de matérialisation.
|
||||
- [x] Porter les modèles de `kb_model` vers `kb-lib`.
|
||||
- [~] Porter les décodeurs Solana core, SPL et Metaplex.
|
||||
- [~] Porter leurs matérialisateurs.
|
||||
- [x] Porter les décodeurs Solana core, SPL et Metaplex déjà implémentés dans bot2.
|
||||
- [x] Porter leurs matérialisateurs déjà implémentés dans bot2.
|
||||
- [ ] Porter leurs exécuteurs.
|
||||
- [x] Fusionner `kb_store_core` et `kb_store_pg` dans `kb-store`.
|
||||
- [ ] Adapter `kb-pipeline` aux nouveaux chemins publics.
|
||||
@@ -37,7 +37,7 @@
|
||||
- [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 l’adaptateur 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] Adapter les règles bot2 devenues incompatibles avec l’architecture bot3.
|
||||
- [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 Token‑2022 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 Token‑2022, les sous-instructions d’extensions 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] 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`
|
||||
|
||||
- [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 d’idempotence.
|
||||
- [x] Réexporter les types concrets et les fonctions stateful publiques depuis la façade de `kb-lib`.
|
||||
- [x] Ajouter un test d’intégration aval prouvant qu’un futur crate externe peut implémenter `EventMaterializer` avec la seule API publique.
|
||||
- [x] Ajouter un test d’intégration aval prouvant qu’un 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] Conserver les identités de processor historiques afin de préserver les clés de replay et d’idempotence existantes.
|
||||
- [x] Ajouter la règle d’ordre et d’absence 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.
|
||||
- [ ] Poursuivre avec les matérialisateurs Memo, SPL Token, ATA, Token‑2022, registre ElGamal et Metaplex.
|
||||
- [x] Valider les 370 tests unitaires et le test d’intégration de `kb-lib`, Clippy et le workspace avec Cargo sur la machine de développement.
|
||||
- [x] Poursuivre avec les matérialisateurs Memo, SPL Token, ATA, Token‑2022, 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 Token‑2022/Metaplex et les types canoniques Metaplex nécessaires à leurs signatures publiques.
|
||||
- [x] Rendre privée toute l’arborescence `kb-lib::materializer` et interdire mécaniquement tout nouveau `pub mod` dans cette frontière.
|
||||
- [x] Étendre les tests aval aux trois contrats d’extension publics : `DcApiProtocolDecoder`, `MtApiEventMaterializer` et `ExApiInstructionExecutor`.
|
||||
- [x] Étendre l’audit 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 d’inté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.
|
||||
|
||||
8
RULES.md
8
RULES.md
@@ -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 lorsqu’il 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`.
|
||||
- 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.
|
||||
- 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`.
|
||||
@@ -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`.
|
||||
- L’ajout 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`.
|
||||
- L’audit mécanique spécifique au projet est exécuté par `python3 scripts/audit_khadhroony_workspace_rules.py`. Il couvre notamment `TRACING_TARGET` et l’usage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`.
|
||||
- L’audit 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 l’usage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`.
|
||||
|
||||
## 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 lorsqu’un 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 d’intégration, benches ou exemples. Une dépendance de test vers un décodeur ou matérialiseur concret est légitime lorsqu’elle sert uniquement à éprouver une orchestration générique fondée sur les traits API ; elle ne prouve pas qu’une 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 d’un `EventMaterializer` doit être ajoutée au registre applicatif et couverte par un test d’inventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` n’est pas activée automatiquement. Les matérialiseurs exclusivement stateful qui n’implé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 d’un `MtApiEventMaterializer` doit être ajoutée au registre applicatif et couverte par un test d’inventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` n’est pas activée automatiquement. Les matérialiseurs exclusivement stateful qui n’implé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.
|
||||
- Une interface officielle Solana ou SPL étroite doit être préférée à `solana-sdk` lorsque son contrat suffit.
|
||||
- L’ordre de préférence des formats est : schéma officiel `wincode`, schéma officiel Borsh, puis parseur local borné reproduisant exactement le runtime lorsque l’interface officielle n’expose 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`.
|
||||
- `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.
|
||||
- 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-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.
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"kb-lib.decoder.spl.elgamal_registry",
|
||||
"kb-lib.decoder.spl.memo",
|
||||
"kb-lib.decoder.spl.token",
|
||||
"kb-lib.decoder.spl.token_2022",
|
||||
"kb-lib.decoder.spl.token2022",
|
||||
"kb_execution_solana",
|
||||
"kb_executor_metadata_metaplex_token_metadata",
|
||||
"kb_executor_metadata_spl_name_service",
|
||||
@@ -40,15 +40,15 @@
|
||||
"kb_executor_spl_noop",
|
||||
"kb_executor_spl_single_pool",
|
||||
"kb_executor_spl_token",
|
||||
"kb_executor_spl_token_2022",
|
||||
"kb_executor_spl_token2022",
|
||||
"kb-logging",
|
||||
"kb-lib.materializer.admin",
|
||||
"kb-lib.materializer.compliance",
|
||||
"kb-lib.materializer.lifecycle",
|
||||
"kb_materializer_risk",
|
||||
"kb-lib.materializer.risk",
|
||||
"kb-lib.materializer.staking",
|
||||
"kb_materializer_token_accounts",
|
||||
"kb_materializer_transaction_annotations",
|
||||
"kb-lib.materializer.token",
|
||||
"kb-lib.materializer.transaction",
|
||||
"kb_pipeline",
|
||||
"kb_rpc",
|
||||
"kb-store",
|
||||
@@ -810,42 +810,42 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_transaction_annotations_debug",
|
||||
"name": "file_kb_lib_materializer_transaction_debug",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/devnet/kb_materializer_transaction_annotations/debug.log",
|
||||
"path": "logs/devnet/kb-lib/materializer/transaction/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/devnet/kb_materializer_transaction_annotations/info.log",
|
||||
"path": "logs/devnet/kb-lib/materializer/transaction/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/devnet/kb_materializer_transaction_annotations/error.jsonl",
|
||||
"path": "logs/devnet/kb-lib/materializer/transaction/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/devnet/kb_materializer_token_accounts/debug.log",
|
||||
"path": "logs/devnet/kb-lib/materializer/token/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/devnet/kb_materializer_token_accounts/info.log",
|
||||
"path": "logs/devnet/kb-lib/materializer/token/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/devnet/kb_materializer_token_accounts/error.jsonl",
|
||||
"path": "logs/devnet/kb-lib/materializer/token/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_token_accounts"
|
||||
"kb-lib.materializer.token"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_debug",
|
||||
"name": "file_kb_lib_materializer_risk_debug",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/devnet/kb_materializer_risk/debug.log",
|
||||
"path": "logs/devnet/kb-lib/materializer/risk/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_risk"
|
||||
"kb-lib.materializer.risk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_info",
|
||||
"name": "file_kb_lib_materializer_risk_info",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/devnet/kb_materializer_risk/info.log",
|
||||
"path": "logs/devnet/kb-lib/materializer/risk/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_risk"
|
||||
"kb-lib.materializer.risk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_error",
|
||||
"name": "file_kb_lib_materializer_risk_error",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/devnet/kb_materializer_risk/error.jsonl",
|
||||
"path": "logs/devnet/kb-lib/materializer/risk/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/devnet/kb_executor_spl_token_2022/debug.log",
|
||||
"path": "logs/devnet/kb_executor_spl_token2022/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/devnet/kb_executor_spl_token_2022/info.log",
|
||||
"path": "logs/devnet/kb_executor_spl_token2022/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/devnet/kb_executor_spl_token_2022/error.jsonl",
|
||||
"path": "logs/devnet/kb_executor_spl_token2022/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_executor_spl_token_2022"
|
||||
"kb_executor_spl_token2022"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -1630,7 +1630,7 @@
|
||||
"kb-lib.decoder.spl.elgamal_registry",
|
||||
"kb-lib.decoder.spl.memo",
|
||||
"kb-lib.decoder.spl.token",
|
||||
"kb-lib.decoder.spl.token_2022",
|
||||
"kb-lib.decoder.spl.token2022",
|
||||
"kb_execution_solana",
|
||||
"kb_executor_metadata_metaplex_token_metadata",
|
||||
"kb_executor_metadata_spl_name_service",
|
||||
@@ -1642,15 +1642,15 @@
|
||||
"kb_executor_spl_noop",
|
||||
"kb_executor_spl_single_pool",
|
||||
"kb_executor_spl_token",
|
||||
"kb_executor_spl_token_2022",
|
||||
"kb_executor_spl_token2022",
|
||||
"kb-logging",
|
||||
"kb-lib.materializer.admin",
|
||||
"kb-lib.materializer.compliance",
|
||||
"kb-lib.materializer.lifecycle",
|
||||
"kb_materializer_risk",
|
||||
"kb-lib.materializer.risk",
|
||||
"kb-lib.materializer.staking",
|
||||
"kb_materializer_token_accounts",
|
||||
"kb_materializer_transaction_annotations",
|
||||
"kb-lib.materializer.token",
|
||||
"kb-lib.materializer.transaction",
|
||||
"kb_pipeline",
|
||||
"kb_rpc",
|
||||
"kb-store",
|
||||
@@ -2412,42 +2412,42 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_transaction_annotations_debug",
|
||||
"name": "file_kb_lib_materializer_transaction_debug",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/mainnet_research/kb_materializer_transaction_annotations/debug.log",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/transaction/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/mainnet_research/kb_materializer_transaction_annotations/info.log",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/transaction/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/mainnet_research/kb_materializer_transaction_annotations/error.jsonl",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/transaction/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/mainnet_research/kb_materializer_token_accounts/debug.log",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/token/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/mainnet_research/kb_materializer_token_accounts/info.log",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/token/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/mainnet_research/kb_materializer_token_accounts/error.jsonl",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/token/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_token_accounts"
|
||||
"kb-lib.materializer.token"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_debug",
|
||||
"name": "file_kb_lib_materializer_risk_debug",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/mainnet_research/kb_materializer_risk/debug.log",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/risk/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_risk"
|
||||
"kb-lib.materializer.risk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_info",
|
||||
"name": "file_kb_lib_materializer_risk_info",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/mainnet_research/kb_materializer_risk/info.log",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/risk/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_risk"
|
||||
"kb-lib.materializer.risk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_error",
|
||||
"name": "file_kb_lib_materializer_risk_error",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/mainnet_research/kb_materializer_risk/error.jsonl",
|
||||
"path": "logs/mainnet_research/kb-lib/materializer/risk/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_executor_spl_token_2022"
|
||||
"kb_executor_spl_token2022"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -3432,7 +3432,7 @@
|
||||
"kb-lib.decoder.spl.elgamal_registry",
|
||||
"kb-lib.decoder.spl.memo",
|
||||
"kb-lib.decoder.spl.token",
|
||||
"kb-lib.decoder.spl.token_2022",
|
||||
"kb-lib.decoder.spl.token2022",
|
||||
"kb_execution_solana",
|
||||
"kb_executor_metadata_metaplex_token_metadata",
|
||||
"kb_executor_metadata_spl_name_service",
|
||||
@@ -3444,15 +3444,15 @@
|
||||
"kb_executor_spl_noop",
|
||||
"kb_executor_spl_single_pool",
|
||||
"kb_executor_spl_token",
|
||||
"kb_executor_spl_token_2022",
|
||||
"kb_executor_spl_token2022",
|
||||
"kb-logging",
|
||||
"kb-lib.materializer.admin",
|
||||
"kb-lib.materializer.compliance",
|
||||
"kb-lib.materializer.lifecycle",
|
||||
"kb_materializer_risk",
|
||||
"kb-lib.materializer.risk",
|
||||
"kb-lib.materializer.staking",
|
||||
"kb_materializer_token_accounts",
|
||||
"kb_materializer_transaction_annotations",
|
||||
"kb-lib.materializer.token",
|
||||
"kb-lib.materializer.transaction",
|
||||
"kb_pipeline",
|
||||
"kb_rpc",
|
||||
"kb-store",
|
||||
@@ -4214,42 +4214,42 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_transaction_annotations_debug",
|
||||
"name": "file_kb_lib_materializer_transaction_debug",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/mainnet/kb_materializer_transaction_annotations/debug.log",
|
||||
"path": "logs/mainnet/kb-lib/materializer/transaction/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/mainnet/kb_materializer_transaction_annotations/info.log",
|
||||
"path": "logs/mainnet/kb-lib/materializer/transaction/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/mainnet/kb_materializer_transaction_annotations/error.jsonl",
|
||||
"path": "logs/mainnet/kb-lib/materializer/transaction/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/mainnet/kb_materializer_token_accounts/debug.log",
|
||||
"path": "logs/mainnet/kb-lib/materializer/token/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/mainnet/kb_materializer_token_accounts/info.log",
|
||||
"path": "logs/mainnet/kb-lib/materializer/token/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/mainnet/kb_materializer_token_accounts/error.jsonl",
|
||||
"path": "logs/mainnet/kb-lib/materializer/token/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_token_accounts"
|
||||
"kb-lib.materializer.token"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_debug",
|
||||
"name": "file_kb_lib_materializer_risk_debug",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/mainnet/kb_materializer_risk/debug.log",
|
||||
"path": "logs/mainnet/kb-lib/materializer/risk/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_risk"
|
||||
"kb-lib.materializer.risk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_info",
|
||||
"name": "file_kb_lib_materializer_risk_info",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/mainnet/kb_materializer_risk/info.log",
|
||||
"path": "logs/mainnet/kb-lib/materializer/risk/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_materializer_risk"
|
||||
"kb-lib.materializer.risk"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "file_kb_materializer_risk_error",
|
||||
"name": "file_kb_lib_materializer_risk_error",
|
||||
"enabled": true,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/mainnet/kb_materializer_risk/error.jsonl",
|
||||
"path": "logs/mainnet/kb-lib/materializer/risk/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"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",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "debug",
|
||||
"path": "logs/mainnet/kb_executor_spl_token_2022/debug.log",
|
||||
"path": "logs/mainnet/kb_executor_spl_token2022/debug.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "info",
|
||||
"path": "logs/mainnet/kb_executor_spl_token_2022/info.log",
|
||||
"path": "logs/mainnet/kb_executor_spl_token2022/info.log",
|
||||
"rotation": "daily",
|
||||
"format": "human",
|
||||
"ansi": false,
|
||||
"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,
|
||||
"sink": "file",
|
||||
"level": "error",
|
||||
"path": "logs/mainnet/kb_executor_spl_token_2022/error.jsonl",
|
||||
"path": "logs/mainnet/kb_executor_spl_token2022/error.jsonl",
|
||||
"rotation": "daily",
|
||||
"format": "json",
|
||||
"ansi": false,
|
||||
"targets": [
|
||||
"kb_executor_spl_token_2022"
|
||||
"kb_executor_spl_token2022"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/CORE_EXTRACTION_CONTRACTS.md -->
|
||||
<!-- version: 5 -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# Contrats d’extraction core Solana
|
||||
|
||||
@@ -38,8 +38,8 @@ L’extraction refuse explicitement :
|
||||
|
||||
- un `canonical_json` absent ;
|
||||
- un `canonical_json_hash` absent ;
|
||||
- une version différente de `CANONICAL_TRANSACTION_FORMAT_VERSION` ;
|
||||
- un JSON non désérialisable en `CanonicalTransaction` ;
|
||||
- une version différente de `MD_CANONICAL_TRANSACTION_FORMAT_VERSION` ;
|
||||
- un JSON non désérialisable en `MdCanonicalTransaction` ;
|
||||
- une signature ou un slot différent de la ligne raw ;
|
||||
- un hash recalculé différent du hash stocké ;
|
||||
- un indice de programme ou de compte hors de l’espace résolu.
|
||||
|
||||
@@ -14,50 +14,50 @@ Ce fichier sépare les identifiants primitifs Solana/SPL du registre des surface
|
||||
|
||||
## Table de contrôle
|
||||
|
||||
| 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_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_upgradeable_v1` | `BPFLoaderUpgradeab1e11111111111111111111111` | `bpf_loader_upgradeable` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_compute_budget_v1` | `ComputeBudget111111111111111111111111111111` | `compute_budget` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_config_v1` | `Config1111111111111111111111111111111111111` | `config` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_ed25519_v1` | `Ed25519SigVerify111111111111111111111111111` | `ed25519` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_feature_v1` | `Feature111111111111111111111111111111111111` | `feature` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_incinerator_v1` | `1nc1nerator11111111111111111111111111111111` | `incinerator` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_loader_v4` | `LoaderV411111111111111111111111111111111111` | `loader_v4` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_native_loader_v1` | `NativeLoader1111111111111111111111111111111` | `native_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256k1_v1` | `KeccakSecp256k11111111111111111111111111111` | `secp256k1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256r1_v1` | `Secp256r1SigVerify1111111111111111111111111` | `secp256r1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_slashing_v1` | `S1ashing11111111111111111111111111111111111` | `slashing` | `stateless_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_stake_config_v1` | `StakeConfig11111111111111111111111111111111` | `stake_config` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_stake_v1` | `Stake11111111111111111111111111111111111111` | `stake` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_system_v1` | `11111111111111111111111111111111` | `system` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_sysvar_clock_v1` | `SysvarC1ock11111111111111111111111111111111` | `sysvar_clock` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_rewards_v1` | `SysvarEpochRewards1111111111111111111111111` | `sysvar_epoch_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_schedule_v1` | `SysvarEpochSchedu1e111111111111111111111111` | `sysvar_epoch_schedule` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_fees_v1` | `SysvarFees111111111111111111111111111111111` | `sysvar_fees` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_instructions_v1` | `Sysvar1nstructions1111111111111111111111111` | `sysvar_instructions` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_last_restart_slot_v1` | `SysvarLastRestartS1ot1111111111111111111111` | `sysvar_last_restart_slot` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_recent_blockhashes_v1` | `SysvarRecentB1ockHashes11111111111111111111` | `sysvar_recent_blockhashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rent_v1` | `SysvarRent111111111111111111111111111111111` | `sysvar_rent` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rewards_v1` | `SysvarRewards111111111111111111111111111111` | `sysvar_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_hashes_v1` | `SysvarS1otHashes111111111111111111111111111` | `sysvar_slot_hashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_history_v1` | `SysvarS1otHistory11111111111111111111111111` | `sysvar_slot_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_stake_history_v1` | `SysvarStakeHistory1111111111111111111111111` | `sysvar_stake_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_v1` | `Sysvar1111111111111111111111111111111111111` | `sysvar` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_vote_v1` | `Vote111111111111111111111111111111111111111` | `vote` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_elgamal_proof_v1` | `ZkE1Gama1Proof11111111111111111111111111111` | `zk_elgamal_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_token_proof_v1` | `ZkTokenProof1111111111111111111111111111111` | `zk_token_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_spl_associated_token_account_v1` | `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL` | `associated_token_account` | `program` | `kb_decoder_spl_associated_token_account` | `core_handled` |
|
||||
| `core_spl_account_compression_v1` | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | `spl_account_compression` | `program` | `kb_decoder_spl_account_compression` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v1` | `Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo` | `spl_memo_v1` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v3` | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | `spl_memo_v3` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v4` | `Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH` | `spl_memo_v4` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_noop_v1` | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | `spl_noop` | `program` | `kb_decoder_spl_noop` | `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_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_elgamal_registry_v1` | `regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg` | `spl_token_2022_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` |
|
||||
| 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_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_upgradeable_v1` | `BPFLoaderUpgradeab1e11111111111111111111111` | `bpf_loader_upgradeable` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_compute_budget_v1` | `ComputeBudget111111111111111111111111111111` | `compute_budget` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_config_v1` | `Config1111111111111111111111111111111111111` | `config` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_ed25519_v1` | `Ed25519SigVerify111111111111111111111111111` | `ed25519` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_feature_v1` | `Feature111111111111111111111111111111111111` | `feature` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_incinerator_v1` | `1nc1nerator11111111111111111111111111111111` | `incinerator` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_loader_v4` | `LoaderV411111111111111111111111111111111111` | `loader_v4` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_native_loader_v1` | `NativeLoader1111111111111111111111111111111` | `native_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256k1_v1` | `KeccakSecp256k11111111111111111111111111111` | `secp256k1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256r1_v1` | `Secp256r1SigVerify1111111111111111111111111` | `secp256r1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_slashing_v1` | `S1ashing11111111111111111111111111111111111` | `slashing` | `stateless_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_stake_config_v1` | `StakeConfig11111111111111111111111111111111` | `stake_config` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_stake_v1` | `Stake11111111111111111111111111111111111111` | `stake` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_system_v1` | `11111111111111111111111111111111` | `system` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_sysvar_clock_v1` | `SysvarC1ock11111111111111111111111111111111` | `sysvar_clock` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_rewards_v1` | `SysvarEpochRewards1111111111111111111111111` | `sysvar_epoch_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_schedule_v1` | `SysvarEpochSchedu1e111111111111111111111111` | `sysvar_epoch_schedule` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_fees_v1` | `SysvarFees111111111111111111111111111111111` | `sysvar_fees` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_instructions_v1` | `Sysvar1nstructions1111111111111111111111111` | `sysvar_instructions` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_last_restart_slot_v1` | `SysvarLastRestartS1ot1111111111111111111111` | `sysvar_last_restart_slot` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_recent_blockhashes_v1` | `SysvarRecentB1ockHashes11111111111111111111` | `sysvar_recent_blockhashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rent_v1` | `SysvarRent111111111111111111111111111111111` | `sysvar_rent` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rewards_v1` | `SysvarRewards111111111111111111111111111111` | `sysvar_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_hashes_v1` | `SysvarS1otHashes111111111111111111111111111` | `sysvar_slot_hashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_history_v1` | `SysvarS1otHistory11111111111111111111111111` | `sysvar_slot_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_stake_history_v1` | `SysvarStakeHistory1111111111111111111111111` | `sysvar_stake_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_v1` | `Sysvar1111111111111111111111111111111111111` | `sysvar` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_vote_v1` | `Vote111111111111111111111111111111111111111` | `vote` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_elgamal_proof_v1` | `ZkE1Gama1Proof11111111111111111111111111111` | `zk_elgamal_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_token_proof_v1` | `ZkTokenProof1111111111111111111111111111111` | `zk_token_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_spl_associated_token_account_v1` | `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL` | `associated_token_account` | `program` | `kb_decoder_spl_associated_token_account` | `core_handled` |
|
||||
| `core_spl_account_compression_v1` | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | `spl_account_compression` | `program` | `kb_decoder_spl_account_compression` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v1` | `Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo` | `spl_memo_v1` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v3` | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | `spl_memo_v3` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v4` | `Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH` | `spl_memo_v4` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_noop_v1` | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | `spl_noop` | `program` | `kb_decoder_spl_noop` | `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_stake_pool_v1` | `SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy` | `stake_pool` | `program` | `kb_decoder_spl_stake_pool` | `core_specialized_reserved_current` |
|
||||
| `core_spl_token_2022_v2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `token2022` | `program` | `kb_decoder_spl_token_2022` | `core_handled` |
|
||||
| `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` |
|
||||
|
||||
@@ -20,7 +20,7 @@ core instruction contextualisée
|
||||
|
||||
## Input contextualisé
|
||||
|
||||
`CoreInstructionReplayInput` reste l’unique contrat d’entrée commun. Son contrat passe à la version `2` dans `0.4.1-pre.014`. Il contient la signature, le slot, le statut et l’erreur on-chain, le chemin stable de l’instruction, 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 l’unique contrat d’entrée commun. Son contrat passe à la version `2` dans `0.4.1-pre.014`. Il contient la signature, le slot, le statut et l’erreur on-chain, le chemin stable de l’instruction, 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`. L’instruction 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
|
||||
|
||||
`InstructionDecoder` expose :
|
||||
`DcApiInstructionDecoder` expose :
|
||||
|
||||
- une identité stable `name/version` ;
|
||||
- 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 l’erreur, 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 l’appel au matérialiseur lorsque la source est échouée ou non commitée. Une seconde barrière valide ensuite les familles de sortie et n’autorise, dans ce contexte, que les matérialisations d’audit 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 l’appel au matérialiseur lorsque la source est échouée ou non commitée. Une seconde barrière valide ensuite les familles de sortie et n’autorise, dans ce contexte, que les matérialisations d’audit ou de risque.
|
||||
|
||||
## Persistance
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
`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
|
||||
|
||||
`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 :
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ Certains protocoles Solana exigent de lire :
|
||||
- des séquences de logs liées à un CPI ;
|
||||
- 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
|
||||
|
||||
@@ -68,7 +68,7 @@ program_id = programme ciblé par le décodeur
|
||||
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
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/MATERIALIZATIONS.md -->
|
||||
<!-- version: 7 -->
|
||||
<!-- version: 8 -->
|
||||
|
||||
# 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 d’autorité 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.
|
||||
|
||||
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 Token‑2022, possède le lifecycle ATA et peut produire un snapshot borné Mint/Account/Multisig Token‑2022 à partir de l’état parsé.
|
||||
- `MtFeesMaterializer` projette les instructions et snapshots de frais Token‑2022 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 d’ATA imbriquée. Aucun score arbitraire n’est inventé.
|
||||
- `MtMetadataMaterializer` projette les metadata incorporées Token‑2022 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
|
||||
|
||||
- `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.
|
||||
- `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.
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
],
|
||||
"provenance_boundaries": [
|
||||
"metaplex_token_metadata",
|
||||
"token_2022_embedded_metadata",
|
||||
"token2022_embedded_metadata",
|
||||
"metaplex_core",
|
||||
"metaplex_bubblegum"
|
||||
],
|
||||
|
||||
@@ -11,21 +11,21 @@ Les sorties ne sont pas des snapshots finaux de comptes ou de runtime. Les état
|
||||
|
||||
## Projections actives par matérialiseur
|
||||
|
||||
| Matérialiseur | Surfaces | Projection |
|
||||
|------------------------------------|----------------------|---------------------------------------------------------------------------------------------------------------------|
|
||||
| `LifecycleMaterializer` | Address Lookup Table | lifecycle create/freeze/extend/deactivate/close |
|
||||
| `LifecycleMaterializer` | Feature | révocation de feature gate |
|
||||
| `LifecycleMaterializer` | Loaders | déploiement, finalisation et transitions lifecycle stables |
|
||||
| `LifecycleMaterializer` | System | durable nonce, create account et allocate |
|
||||
| `LifecycleMaterializer` | ZK ElGamal | création ou fermeture d’un compte de contexte |
|
||||
| `LifecycleMaterializer` | Slashing | initialisation ou fermeture d’un rapport de violation |
|
||||
| `AdminMaterializer` | System | assign et assign with seed |
|
||||
| `AdminMaterializer` | Config | écriture opaque bornée avec clés, taille, SHA-256 et préfixe |
|
||||
| `AdminMaterializer` | Loaders | changements d’autorité |
|
||||
| `ComplianceAuditMaterializer` | 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 |
|
||||
| `StakingMaterializer` | 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 |
|
||||
| Matérialiseur | Surfaces | Projection |
|
||||
|---------------------------------|----------------------|---------------------------------------------------------------------------------------------------------------------|
|
||||
| `MtLifecycleMaterializer` | Address Lookup Table | lifecycle create/freeze/extend/deactivate/close |
|
||||
| `MtLifecycleMaterializer` | Feature | révocation de feature gate |
|
||||
| `MtLifecycleMaterializer` | Loaders | déploiement, finalisation et transitions lifecycle stables |
|
||||
| `MtLifecycleMaterializer` | System | durable nonce, create account et allocate |
|
||||
| `MtLifecycleMaterializer` | ZK ElGamal | création ou fermeture d’un compte de contexte |
|
||||
| `MtLifecycleMaterializer` | Slashing | initialisation ou fermeture d’un rapport de violation |
|
||||
| `MtAdminMaterializer` | System | assign et assign with seed |
|
||||
| `MtAdminMaterializer` | Config | écriture opaque bornée avec clés, taille, SHA-256 et préfixe |
|
||||
| `MtAdminMaterializer` | Loaders | changements d’autorité |
|
||||
| `MtComplianceAuditMaterializer` | Loaders | écritures/copies de bytecode bornées par offsets, tailles, SHA-256 et préfixes |
|
||||
| `MtComplianceAuditMaterializer` | Compute Budget | profil transactionnel agrégé, last-write-wins, une seule sortie par transaction |
|
||||
| `MtStakingMaterializer` | Stake | compte, délégation, désactivation, split, merge, withdraw, move stake/lamports, autorités et lockup instructionnels |
|
||||
| `MtStakingMaterializer` | Vote | compte, autorités, identité, commission, vote state, retraits et dépôt de rewards instructionnels |
|
||||
|
||||
## Politique des transactions échouées
|
||||
|
||||
|
||||
@@ -54,52 +54,52 @@ 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.
|
||||
|
||||
| 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_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_upgradeable_v1` | `BPFLoaderUpgradeab1e11111111111111111111111` | `bpf_loader_upgradeable` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_compute_budget_v1` | `ComputeBudget111111111111111111111111111111` | `compute_budget` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_config_v1` | `Config1111111111111111111111111111111111111` | `config` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_ed25519_v1` | `Ed25519SigVerify111111111111111111111111111` | `ed25519` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_feature_v1` | `Feature111111111111111111111111111111111111` | `feature` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_incinerator_v1` | `1nc1nerator11111111111111111111111111111111` | `incinerator` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_loader_v4` | `LoaderV411111111111111111111111111111111111` | `loader_v4` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_native_loader_v1` | `NativeLoader1111111111111111111111111111111` | `native_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256k1_v1` | `KeccakSecp256k11111111111111111111111111111` | `secp256k1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256r1_v1` | `Secp256r1SigVerify1111111111111111111111111` | `secp256r1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_stake_config_v1` | `StakeConfig11111111111111111111111111111111` | `stake_config` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_stake_v1` | `Stake11111111111111111111111111111111111111` | `stake` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_system_v1` | `11111111111111111111111111111111` | `system` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_sysvar_clock_v1` | `SysvarC1ock11111111111111111111111111111111` | `sysvar_clock` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_rewards_v1` | `SysvarEpochRewards1111111111111111111111111` | `sysvar_epoch_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_schedule_v1` | `SysvarEpochSchedu1e111111111111111111111111` | `sysvar_epoch_schedule` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_fees_v1` | `SysvarFees111111111111111111111111111111111` | `sysvar_fees` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_instructions_v1` | `Sysvar1nstructions1111111111111111111111111` | `sysvar_instructions` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_last_restart_slot_v1` | `SysvarLastRestartS1ot1111111111111111111111` | `sysvar_last_restart_slot` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_recent_blockhashes_v1` | `SysvarRecentB1ockHashes11111111111111111111` | `sysvar_recent_blockhashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rent_v1` | `SysvarRent111111111111111111111111111111111` | `sysvar_rent` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rewards_v1` | `SysvarRewards111111111111111111111111111111` | `sysvar_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_hashes_v1` | `SysvarS1otHashes111111111111111111111111111` | `sysvar_slot_hashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_history_v1` | `SysvarS1otHistory11111111111111111111111111` | `sysvar_slot_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_stake_history_v1` | `SysvarStakeHistory1111111111111111111111111` | `sysvar_stake_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_v1` | `Sysvar1111111111111111111111111111111111111` | `sysvar` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_vote_v1` | `Vote111111111111111111111111111111111111111` | `vote` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_elgamal_proof_v1` | `ZkE1Gama1Proof11111111111111111111111111111` | `zk_elgamal_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_token_proof_v1` | `ZkTokenProof1111111111111111111111111111111` | `zk_token_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_spl_associated_token_account_v1` | `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL` | `associated_token_account` | `program` | `kb_decoder_spl_associated_token_account` | `core_handled` |
|
||||
| `core_spl_account_compression_v1` | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | `spl_account_compression` | `program` | `kb_decoder_spl_account_compression` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v1` | `Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo` | `spl_memo_v1` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v3` | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | `spl_memo_v3` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v4` | `Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH` | `spl_memo_v4` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_noop_v1` | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | `spl_noop` | `program` | `kb_decoder_spl_noop` | `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_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_elgamal_registry_v1` | `regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg` | `spl_token_2022_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` |
|
||||
| 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_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_upgradeable_v1` | `BPFLoaderUpgradeab1e11111111111111111111111` | `bpf_loader_upgradeable` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_compute_budget_v1` | `ComputeBudget111111111111111111111111111111` | `compute_budget` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_config_v1` | `Config1111111111111111111111111111111111111` | `config` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_ed25519_v1` | `Ed25519SigVerify111111111111111111111111111` | `ed25519` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_feature_v1` | `Feature111111111111111111111111111111111111` | `feature` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_incinerator_v1` | `1nc1nerator11111111111111111111111111111111` | `incinerator` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_loader_v4` | `LoaderV411111111111111111111111111111111111` | `loader_v4` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_native_loader_v1` | `NativeLoader1111111111111111111111111111111` | `native_loader` | `loader_program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256k1_v1` | `KeccakSecp256k11111111111111111111111111111` | `secp256k1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_secp256r1_v1` | `Secp256r1SigVerify1111111111111111111111111` | `secp256r1` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_stake_config_v1` | `StakeConfig11111111111111111111111111111111` | `stake_config` | `well_known_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_stake_v1` | `Stake11111111111111111111111111111111111111` | `stake` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_system_v1` | `11111111111111111111111111111111` | `system` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_sysvar_clock_v1` | `SysvarC1ock11111111111111111111111111111111` | `sysvar_clock` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_rewards_v1` | `SysvarEpochRewards1111111111111111111111111` | `sysvar_epoch_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_epoch_schedule_v1` | `SysvarEpochSchedu1e111111111111111111111111` | `sysvar_epoch_schedule` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_fees_v1` | `SysvarFees111111111111111111111111111111111` | `sysvar_fees` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_instructions_v1` | `Sysvar1nstructions1111111111111111111111111` | `sysvar_instructions` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_last_restart_slot_v1` | `SysvarLastRestartS1ot1111111111111111111111` | `sysvar_last_restart_slot` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_recent_blockhashes_v1` | `SysvarRecentB1ockHashes11111111111111111111` | `sysvar_recent_blockhashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rent_v1` | `SysvarRent111111111111111111111111111111111` | `sysvar_rent` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_rewards_v1` | `SysvarRewards111111111111111111111111111111` | `sysvar_rewards` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_hashes_v1` | `SysvarS1otHashes111111111111111111111111111` | `sysvar_slot_hashes` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_slot_history_v1` | `SysvarS1otHistory11111111111111111111111111` | `sysvar_slot_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_stake_history_v1` | `SysvarStakeHistory1111111111111111111111111` | `sysvar_stake_history` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_sysvar_v1` | `Sysvar1111111111111111111111111111111111111` | `sysvar` | `sysvar_account` | `kb_decoder_solana_core` | `core_recognized_account` |
|
||||
| `core_solana_vote_v1` | `Vote111111111111111111111111111111111111111` | `vote` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_elgamal_proof_v1` | `ZkE1Gama1Proof11111111111111111111111111111` | `zk_elgamal_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_solana_zk_token_proof_v1` | `ZkTokenProof1111111111111111111111111111111` | `zk_token_proof` | `program` | `kb_decoder_solana_core` | `core_handled` |
|
||||
| `core_spl_associated_token_account_v1` | `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL` | `associated_token_account` | `program` | `kb_decoder_spl_associated_token_account` | `core_handled` |
|
||||
| `core_spl_account_compression_v1` | `cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK` | `spl_account_compression` | `program` | `kb_decoder_spl_account_compression` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v1` | `Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo` | `spl_memo_v1` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v3` | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | `spl_memo_v3` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_memo_v4` | `Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH` | `spl_memo_v4` | `program` | `kb_decoder_spl_memo` | `core_specialized_reserved_current` |
|
||||
| `core_spl_noop_v1` | `noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV` | `spl_noop` | `program` | `kb_decoder_spl_noop` | `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_stake_pool_v1` | `SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy` | `stake_pool` | `program` | `kb_decoder_spl_stake_pool` | `core_specialized_reserved_current` |
|
||||
| `core_spl_token_2022_v2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `token2022` | `program` | `kb_decoder_spl_token_2022` | `core_handled` |
|
||||
| `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` |
|
||||
|
||||
|
||||
## DEX, AMM, CPMM, CLMM, DLMM, stable swap, weighted swap et orderbooks
|
||||
@@ -245,15 +245,15 @@ Ces identifiants sont détaillés dans `docs/CORE_PROGRAM_IDS.md`. Ils sont couv
|
||||
|
||||
## NFT, metadata, admin, governance et locks
|
||||
|
||||
| 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` |
|
||||
| `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` |
|
||||
| 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` |
|
||||
| `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` |
|
||||
| `metadata_metaplex_token_metadata` | `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s` | `metaplex_token_metadata` | `metaplex_token_metadata` | `-` | `kb_lib::decoder::metadata::metaplex_token_metadata` | `current_migrated` |
|
||||
| `metadata_name_service` | `namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX` | `name_service` | `name_service` | `-` | `kb_decoder_metadata_spl_name_service` | `reserved_missing` |
|
||||
| `nft_metaplex_bubblegum` | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | `bubblegum` | `bubblegum` | `-` | `kb_decoder_nft_metaplex_bubblegum` | `reserved_missing` |
|
||||
| `nft_metaplex_mpl_core` | `CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d` | `mpl_core` | `mpl_core` | `-` | `kb_decoder_nft_metaplex_mpl_core` | `reserved_missing` |
|
||||
| `metadata_name_service` | `namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX` | `name_service` | `name_service` | `-` | `kb_decoder_metadata_spl_name_service` | `reserved_missing` |
|
||||
| `nft_metaplex_bubblegum` | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | `bubblegum` | `bubblegum` | `-` | `kb_decoder_nft_metaplex_bubblegum` | `reserved_missing` |
|
||||
| `nft_metaplex_mpl_core` | `CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d` | `mpl_core` | `mpl_core` | `-` | `kb_decoder_nft_metaplex_mpl_core` | `reserved_missing` |
|
||||
|
||||
|
||||
## Surfaces à classifier
|
||||
|
||||
@@ -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 ;
|
||||
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 ;
|
||||
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 ;
|
||||
6. fermeture : `cargo fmt --all`, audit strict, tests workspace et Clippy global.
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ Le message à signer provient de `solana_transaction::Transaction::message_data(
|
||||
|
||||
## Identifiants natifs, Vote et loaders dans l’exé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 lorsqu’une crate appelle réellement ses fonctions d’introspection d’instructions, 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 lorsqu’une crate appelle réellement ses fonctions d’introspection d’instructions, 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` n’est 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.
|
||||
|
||||
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
|
||||
distincts ; aucun pointeur TLV n’est interprété comme une preuve de l’état du programme externe
|
||||
pointé.
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
{
|
||||
"file": "docs/SPL_ASSOCIATED_TOKEN_ACCOUNT_MATRIX.json",
|
||||
"version": 10,
|
||||
"version": 11,
|
||||
"schemaVersion": 1,
|
||||
"bot3Migration": {
|
||||
"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",
|
||||
"preservedDifferentialTests": 10,
|
||||
"materializerPorted": false,
|
||||
"materializerPorted": true,
|
||||
"publicMaterializers": [
|
||||
"kb_lib::TokenAccountsMaterializer",
|
||||
"kb_lib::RiskMaterializer"
|
||||
],
|
||||
"executorPorted": false,
|
||||
"pipelinePorted": false
|
||||
},
|
||||
@@ -15,7 +19,7 @@
|
||||
"systemProgramId": "11111111111111111111111111111111",
|
||||
"supportedTokenPrograms": [
|
||||
{"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": {
|
||||
"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"],
|
||||
"event": "spl_associated_token_account.create",
|
||||
"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},
|
||||
"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",
|
||||
@@ -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"],
|
||||
"event": "spl_associated_token_account.create_idempotent",
|
||||
"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},
|
||||
"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",
|
||||
@@ -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"],
|
||||
"event": "spl_associated_token_account.recover_nested",
|
||||
"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},
|
||||
"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": {
|
||||
"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"],
|
||||
"tokenPrograms": ["spl_token_classic", "token_2022"],
|
||||
"tokenPrograms": ["spl_token_classic", "token2022"],
|
||||
"locations": ["outer", "inner_cpi"],
|
||||
"transactionOutcomes": ["committed", "failed_uncommitted_intent"],
|
||||
"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",
|
||||
"projectionOwners": [
|
||||
{
|
||||
"crate": "kb_materializer_token_accounts",
|
||||
"crate": "kb-lib",
|
||||
"component": "materializer.token.accounts",
|
||||
"facts": [
|
||||
"ata_created",
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"crate": "kb_materializer_risk",
|
||||
"crate": "kb-lib",
|
||||
"component": "materializer.risk",
|
||||
"facts": [
|
||||
"nested_ata_anti_pattern_recovered"
|
||||
],
|
||||
@@ -173,15 +179,18 @@
|
||||
],
|
||||
"explicitNoProjection": [
|
||||
{
|
||||
"crate": "kb_materializer_lifecycle",
|
||||
"reason": "Native program lifecycle remains owned here; duplicating ATA lifecycle would overlap kb_materializer_token_accounts."
|
||||
"crate": "kb-lib",
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"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."
|
||||
}
|
||||
],
|
||||
@@ -195,7 +204,7 @@
|
||||
"deploymentAudit": {
|
||||
"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}},
|
||||
"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"
|
||||
},
|
||||
"nonClaims": [
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"file": "docs/SPL_MEMO_MATRIX.json",
|
||||
"version": 9,
|
||||
"version": 10,
|
||||
"matrixVersion": 4,
|
||||
"scope": "SPL Memo v1, v3 et v4",
|
||||
"bot3Migration": {
|
||||
"decoderModule": "kb_lib::decoder::spl::memo",
|
||||
"publicDecoder": "kb_lib::SplMemoDecoder",
|
||||
"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"
|
||||
},
|
||||
"interface": {
|
||||
@@ -113,7 +114,8 @@
|
||||
"unknownProgramProducesObservation": false
|
||||
},
|
||||
"materializationContract": {
|
||||
"crate": "kb_materializer_transaction_annotations",
|
||||
"crate": "kb-lib",
|
||||
"component": "materializer.transaction.annotations",
|
||||
"processorName": "transaction_annotations",
|
||||
"materializedFamily": "transaction_annotation",
|
||||
"acceptedEntries": ["add_memo", "memo_intent", "invalid_memo_attempt"],
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<!-- file: docs/SPL_TOKEN_2022_CONFIDENTIAL_EXECUTION_AUDIT.md -->
|
||||
<!-- file: docs/SPL_TOKEN2022_CONFIDENTIAL_EXECUTION_AUDIT.md -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# Audit d’exécution Confidential Transfer Token-2022
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"file": "docs/SPL_TOKEN_2022_MATRIX.json",
|
||||
"file": "docs/SPL_TOKEN2022_MATRIX.json",
|
||||
"version": "0.1.0-pre.008",
|
||||
"schemaVersion": 1,
|
||||
"matrixStatus": "exact_decoder_leaf_coverage_proven_pending_materialization_executor_preflight_and_cluster_corpus_completion",
|
||||
@@ -30,7 +30,7 @@
|
||||
"default",
|
||||
"serde"
|
||||
],
|
||||
"leafConsumer": "kb-lib.decoder.spl.token_2022",
|
||||
"leafConsumer": "kb-lib.decoder.spl.token2022",
|
||||
"operatorEvidence": "cargo tree -i spl-token-2022-interface -e features",
|
||||
"publishedCandidateAudited": "3.1.1",
|
||||
"publishedCandidateStatus": "matches_confirmed_workspace_resolution",
|
||||
@@ -2060,7 +2060,7 @@
|
||||
"stable_fact_only_no_score"
|
||||
],
|
||||
"lifecycle": [
|
||||
"no_token_2022_claim_until_non_overlap_is_proven"
|
||||
"no_token2022_claim_until_non_overlap_is_proven"
|
||||
]
|
||||
},
|
||||
"forbiddenClaims": [
|
||||
@@ -1,4 +1,4 @@
|
||||
<!-- file: docs/SPL_TOKEN_2022_SOURCE_AUDIT.md -->
|
||||
<!-- file: docs/SPL_TOKEN2022_SOURCE_AUDIT.md -->
|
||||
<!-- version: 6 -->
|
||||
|
||||
# Audit des sources Token-2022 résolues
|
||||
@@ -39,7 +39,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "token_2022_public_devnet",
|
||||
"id": "token2022_public_devnet",
|
||||
"environment": "devnet",
|
||||
"status": "not_run",
|
||||
"requiredEvidence": [
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/TRACING_CONTRACT.md -->
|
||||
<!-- version: 19 -->
|
||||
<!-- version: 20 -->
|
||||
|
||||
# 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.memo
|
||||
kb-lib.decoder.spl.token
|
||||
kb-lib.decoder.spl.token_2022
|
||||
kb-lib.decoder.spl.token2022
|
||||
kb-lib.materializer.admin
|
||||
kb-lib.materializer.compliance
|
||||
kb-lib.materializer.lifecycle
|
||||
kb-lib.materializer.risk
|
||||
kb-lib.materializer.staking
|
||||
kb-lib.materializer.token
|
||||
kb-lib.materializer.transaction
|
||||
kb-logging
|
||||
kb-store
|
||||
```
|
||||
|
||||
@@ -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
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
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`
|
||||
|
||||
|
||||
@@ -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 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 `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 replay par instruction : état instruction, filtre de replay et lifecycle mark.
|
||||
- [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
|
||||
|
||||
- [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] 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()`.
|
||||
@@ -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] 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 d’interfaces officielles : dépendance seulement au point de consommation, priorité `wincode` puis Borsh, parser borné lorsque l’interface n’expose 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 dans `pre.016` l’ancien `zk_token_proof` comme compatibilité historique, puis retirer dans `pre.019` la dépendance dépréciée `solana-zk-token-sdk` au profit d’un 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 l’invocation 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 d’orchestration
|
||||
|
||||
- [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] 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 l’interface 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` : distinguer la simulation exacte de la simulation avec remplacement de blockhash et interdire qu’un 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] `pre.006` : corriger la compilation croisée de `pre.005`, supprimer l’avertissement TS-rs sur l’alias historique `mainnet_beta`, utiliser le trait public `TypedInstructionExecutor` dans les tests d’assemblage, 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 l’avertissement TS-rs sur l’alias historique `mainnet_beta`, utiliser le trait public `ExApiTypedInstructionExecutor` dans les tests d’assemblage, 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 d’exé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] `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] `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] `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] `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.
|
||||
|
||||
@@ -138,7 +138,7 @@ Aucun renommage massif de crates n'est autorisé sans étape de contrôle dédi
|
||||
|
||||
- Une crate est opérationnelle lorsqu’elle 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`.
|
||||
- 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 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 l’installation du subscriber.
|
||||
- Il est interdit d’ajouter `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`.
|
||||
- L’ajout 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`.
|
||||
- L’audit mécanique spécifique au projet est exécuté par `python3 scripts/audit_khadhroony_workspace_rules.py`. Il couvre notamment `TRACING_TARGET` et l’usage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`.
|
||||
- L’audit 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 l’usage obligatoire de `solana_pubkey::Pubkey` à la place de `solana_address::Address`.
|
||||
|
||||
## 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 lorsqu’un 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 d’intégration, benches ou exemples. Une dépendance de test vers un décodeur ou matérialiseur concret est légitime lorsqu’elle sert uniquement à éprouver une orchestration générique fondée sur les traits API ; elle ne prouve pas qu’une 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 d’un `EventMaterializer` doit être ajoutée au registre applicatif et couverte par un test d’inventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` n’est pas activée automatiquement. Les matérialiseurs exclusivement stateful qui n’implé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 d’un `MtApiEventMaterializer` doit être ajoutée au registre applicatif et couverte par un test d’inventaire ordonné ; une crate présente dans le workspace ou dans `kb_pipeline` n’est pas activée automatiquement. Les matérialiseurs exclusivement stateful qui n’implé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.
|
||||
- Une interface officielle Solana ou SPL étroite doit être préférée à `solana-sdk` lorsque son contrat suffit.
|
||||
- L’ordre de préférence des formats est : schéma officiel `wincode`, schéma officiel Borsh, puis parseur local borné reproduisant exactement le runtime lorsque l’interface officielle n’expose que `bincode`.
|
||||
|
||||
@@ -10,12 +10,12 @@ mod error;
|
||||
mod module;
|
||||
|
||||
/// Workspace-wide explicit error type.
|
||||
pub use crate::error::Error;
|
||||
pub use self::error::Error;
|
||||
/// Workspace-wide result alias.
|
||||
pub use crate::error::Result;
|
||||
pub use self::error::Result;
|
||||
/// Processing module category.
|
||||
pub use crate::module::ModuleKind;
|
||||
pub use self::module::ModuleKind;
|
||||
/// Stable module name.
|
||||
pub use crate::module::ModuleName;
|
||||
pub use self::module::ModuleName;
|
||||
/// Stable semantic module version.
|
||||
pub use crate::module::ModuleVersion;
|
||||
pub use self::module::ModuleVersion;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
## 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 :
|
||||
|
||||
@@ -25,13 +25,13 @@ La matrice `docs/NATIVE_SOLANA_DECODER_MATRIX.json` reste la source machine-read
|
||||
|
||||
## 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`.
|
||||
|
||||
## 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
|
||||
les tags `0..24`, `38`, `45` et `255`, y compris les variantes historiques, checked,
|
||||
`WithdrawExcessLamports`, `UnwrapLamports` et `Batch`.
|
||||
@@ -45,7 +45,7 @@ normative est `docs/SPL_TOKEN_MATRIX.json`.
|
||||
|
||||
## Décodeur SPL Associated Token Account
|
||||
|
||||
`SplAssociatedTokenAccountDecoder` couvre exclusivement
|
||||
`DcSplAssociatedTokenAccountDecoder` couvre exclusivement
|
||||
`ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL`. Il reconnaît les trois variantes publiées
|
||||
`Create`, `CreateIdempotent` et `RecoverNested`, ainsi que l’encodage historique vide de `Create`.
|
||||
|
||||
@@ -58,7 +58,7 @@ Program ID sans reconstruire leur état ni interpréter leurs extensions. La mat
|
||||
|
||||
## Décodeur SPL Token‑2022
|
||||
|
||||
`SplToken2022Decoder` couvre exclusivement
|
||||
`DcSplToken2022Decoder` couvre exclusivement
|
||||
`TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`. Il conserve les 48 enveloppes de premier niveau,
|
||||
les sous-instructions d’extensions dont le wire est officiellement identifiable, les interfaces
|
||||
Token Metadata et Token Group exécutées directement par Token‑2022, ainsi que `Batch` sans batch
|
||||
@@ -67,22 +67,22 @@ imbriqué.
|
||||
Le décodeur borne les payloads, les chaînes de metadata, le nombre d’enfants et les comptes
|
||||
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
|
||||
`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 d’un programme externe pointé. La matrice normative
|
||||
est `docs/SPL_TOKEN_2022_MATRIX.json`.
|
||||
|
||||
## Décodeur du registre ElGamal
|
||||
|
||||
`SplElgamalRegistryDecoder` couvre le programme indépendant
|
||||
`DcSplElgamalRegistryDecoder` couvre le programme indépendant
|
||||
`regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg`. Il décode exactement `CreateRegistry` et
|
||||
`UpdateRegistry`, conserve l’offset 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
|
||||
`docs/SPL_ELGAMAL_REGISTRY_MATRIX.json`.
|
||||
|
||||
## Décodeur Metaplex Token Metadata
|
||||
|
||||
`MetadataMetaplexTokenMetadataDecoder` couvre exclusivement
|
||||
`DcMetadataMetaplexTokenMetadataDecoder` couvre exclusivement
|
||||
`metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s`. Il inventorie exactement les 58
|
||||
discriminateurs `0..=57`, conserve les arguments Borsh, les comptes positionnels,
|
||||
les placeholders optionnels, les chemins outer/CPI et les transactions échouées
|
||||
@@ -100,22 +100,22 @@ politique d’exécution définitivement interdite. La matrice normative est
|
||||
|
||||
## API publique utile
|
||||
|
||||
- `EventMaterializer`, `MaterializerIdentity`, `MaterializationTransactionPolicy`, `MaterializerExecutionResult` et `MaterializedOutput` : contrat complet utilisable par un matérialiseur interne ou externe ;
|
||||
- `LifecycleMaterializer`, `AdminMaterializer`, `ComplianceAuditMaterializer` et `StakingMaterializer` : matérialisateurs Solana natifs concrets ;
|
||||
- `materialize_token_2022_admin_state_snapshots()` et `materialize_elgamal_registry_state_snapshot()` : projections stateful d’administration déjà exposées ;
|
||||
- `SolanaCoreDecoder` : décodeur concret natif ;
|
||||
- `SplMemoDecoder` : décodeur exact des trois générations SPL Memo ;
|
||||
- `SplTokenDecoder` : décodeur exact du programme SPL Token classique ;
|
||||
- `SplAssociatedTokenAccountDecoder` : décodeur exact du programme Associated Token Account ;
|
||||
- `SplToken2022Decoder` : décodeur exact des instructions Token‑2022 ;
|
||||
- `Token2022State`, `Token2022StateKind`, `Token2022TlvEntry` et `parse_token_2022_state()` : API publique de lecture d’état Token‑2022 ;
|
||||
- `SplElgamalRegistryDecoder`, `ElGamalRegistryState` et `parse_elgamal_registry_state()` : API publique du registre ElGamal ;
|
||||
- `MetadataMetaplexTokenMetadataDecoder` : décodeur exact du programme Metaplex Token Metadata ;
|
||||
- `MtApiEventMaterializer`, `MtApiMaterializerIdentity`, `MtApiMaterializationTransactionPolicy`, `MtApiMaterializerExecutionResult` et `MtApiMaterializedOutput` : contrat complet utilisable par un matérialiseur interne ou externe ;
|
||||
- `MtLifecycleMaterializer`, `MtAdminMaterializer`, `MtComplianceAuditMaterializer` et `MtStakingMaterializer` : matérialisateurs Solana natifs concrets ;
|
||||
- `materialize_token2022_admin_state_snapshots()` et `materialize_elgamal_registry_state_snapshot()` : projections stateful d’administration déjà exposées ;
|
||||
- `DcSolanaCoreDecoder` : décodeur concret natif ;
|
||||
- `DcSplMemoDecoder` : décodeur exact des trois générations SPL Memo ;
|
||||
- `DcSplTokenDecoder` : décodeur exact du programme SPL Token classique ;
|
||||
- `DcSplAssociatedTokenAccountDecoder` : décodeur exact du programme Associated Token Account ;
|
||||
- `DcSplToken2022Decoder` : décodeur exact des instructions Token‑2022 ;
|
||||
- `DcToken2022State`, `DcToken2022StateKind`, `DcToken2022TlvEntry` et `decoder_spl_token2022_token2022_state()` : API publique de lecture d’état Token‑2022 ;
|
||||
- `DcSplElgamalRegistryDecoder`, `DcSplElGamalRegistryState` et `decoder_spl_elgamal_registry_parse_elgamal_registry_state()` : API publique du registre ElGamal ;
|
||||
- `DcMetadataMetaplexTokenMetadataDecoder` : décodeur exact du programme Metaplex Token Metadata ;
|
||||
- `kb_lib::decoder::metadata::metaplex_token_metadata` : parseurs et snapshots publics des comptes Metaplex ;
|
||||
- `InstructionDecoder` : contrat de reconnaissance, couverture et décodage contextualisé ;
|
||||
- `ProtocolDecoder` : contrat de compatibilité avec les observations historiques ;
|
||||
- `CoreInstructionReplayInput` : input source-neutral produit par l’extraction core ;
|
||||
- `DecoderExecutionResult`, `DecoderRecognition` et `DecoderCoverageDeclaration` : résultats typés du pipeline ;
|
||||
- `DcApiInstructionDecoder` : contrat de reconnaissance, couverture et décodage contextualisé ;
|
||||
- `DcApiProtocolDecoder` : contrat de compatibilité avec les observations historiques ;
|
||||
- `MdCoreInstructionReplayInput` : input source-neutral produit par l’extraction core ;
|
||||
- `DcApiDecoderExecutionResult`, `DcApiDecoderRecognition` et `DcApiDecoderCoverageDeclaration` : résultats typés du pipeline ;
|
||||
- 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.
|
||||
|
||||
@@ -3,164 +3,498 @@
|
||||
|
||||
//! Consolidated decoder modules.
|
||||
|
||||
pub mod adapter;
|
||||
pub mod admin;
|
||||
pub mod amm;
|
||||
pub mod anchor;
|
||||
pub mod api;
|
||||
pub mod bridge;
|
||||
pub mod clmm;
|
||||
pub mod cpmm;
|
||||
pub mod dlmm;
|
||||
pub mod fees;
|
||||
pub mod governance;
|
||||
pub mod launchpad;
|
||||
pub mod lending;
|
||||
pub mod lock;
|
||||
pub mod metadata;
|
||||
pub mod nft;
|
||||
pub mod orderbook;
|
||||
pub mod perpetuals;
|
||||
pub mod router;
|
||||
pub mod rwa;
|
||||
pub mod solana;
|
||||
pub mod spl;
|
||||
pub mod stable;
|
||||
pub mod staking;
|
||||
pub mod treasury;
|
||||
pub mod vault;
|
||||
pub mod vesting;
|
||||
pub mod wallet;
|
||||
pub mod weighted;
|
||||
mod adapter;
|
||||
mod admin;
|
||||
mod amm;
|
||||
mod anchor;
|
||||
mod api;
|
||||
mod bridge;
|
||||
mod clmm;
|
||||
mod cpmm;
|
||||
mod dlmm;
|
||||
mod fees;
|
||||
mod governance;
|
||||
mod launchpad;
|
||||
mod lending;
|
||||
mod lock;
|
||||
mod metadata;
|
||||
mod nft;
|
||||
mod orderbook;
|
||||
mod perpetuals;
|
||||
mod router;
|
||||
mod rwa;
|
||||
mod solana;
|
||||
mod spl;
|
||||
mod stable;
|
||||
mod staking;
|
||||
mod treasury;
|
||||
mod vault;
|
||||
mod vesting;
|
||||
mod wallet;
|
||||
mod weighted;
|
||||
|
||||
/// One parsed SPL ElGamal registry instruction.
|
||||
pub(crate) use self::spl::ParsedRegistryInstruction;
|
||||
/// Approve Collection Authority discriminator.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
pub(crate) use self::spl::SPL_MEMO_TRACING_TARGET;
|
||||
pub(crate) use self::spl::DC_SPL_MEMO_TRACING_TARGET;
|
||||
/// 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.
|
||||
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.
|
||||
pub(crate) use self::spl::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;
|
||||
pub(crate) use self::spl::DC_SPL_MEMO_V4_SURFACE_CODE;
|
||||
/// 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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
pub(crate) use self::spl::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;
|
||||
pub(crate) use self::spl::decoder_spl_memo_decode;
|
||||
/// 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.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
pub use self::spl::ELGAMAL_REGISTRY_ACCOUNT_LEN;
|
||||
/// Parsed SPL ElGamal public-key registry account.
|
||||
pub use self::spl::ElGamalRegistryState;
|
||||
pub use self::spl::DC_SPL_ELGAMAL_REGISTRY_ACCOUNT_LEN;
|
||||
/// 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.
|
||||
pub use self::spl::SplElgamalRegistryDecoder;
|
||||
pub use self::spl::DcSplElgamalRegistryDecoder;
|
||||
/// 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.
|
||||
pub use self::spl::SplToken2022Decoder;
|
||||
pub use self::spl::DcSplToken2022Decoder;
|
||||
/// 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.
|
||||
pub use self::spl::Token2022State;
|
||||
pub use self::spl::DcToken2022State;
|
||||
/// Exact Token-2022 base account state kind.
|
||||
pub use self::spl::Token2022StateKind;
|
||||
pub use self::spl::DcToken2022StateKind;
|
||||
/// One exact Token-2022 TLV entry.
|
||||
pub use self::spl::Token2022TlvEntry;
|
||||
pub use self::spl::DcToken2022TlvEntry;
|
||||
/// 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.
|
||||
pub use self::spl::parse_token_2022_state;
|
||||
pub use self::spl::decoder_spl_token2022_parse_token2022_state;
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
//! `adapter` decoder family.
|
||||
|
||||
pub mod saber_decimal_wrapper;
|
||||
mod saber_decimal_wrapper;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_adapter_saber_decimal_wrapper`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
|
||||
//! `admin` decoder family.
|
||||
|
||||
pub mod jupiter_lock;
|
||||
pub mod pump_fees;
|
||||
mod jupiter_lock;
|
||||
mod pump_fees;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_admin_jupiter_lock`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_admin_pump_fees`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,29 +3,29 @@
|
||||
|
||||
//! `amm` decoder family.
|
||||
|
||||
pub mod aldrin_v1;
|
||||
pub mod aldrin_v2;
|
||||
pub mod alphaq;
|
||||
pub mod believe;
|
||||
pub mod bonk_swap;
|
||||
pub mod fluxbeam;
|
||||
pub mod goon_fi;
|
||||
pub mod goosefx_gamma;
|
||||
pub mod goosefx_v2;
|
||||
pub mod guac_swap;
|
||||
pub mod lifinity_swap_v2;
|
||||
pub mod metadao_futarchy_amm;
|
||||
pub mod metadao_v0_5;
|
||||
pub mod meteora_damm_v1;
|
||||
pub mod meteora_damm_v2;
|
||||
pub mod obric_v2;
|
||||
pub mod one_dex;
|
||||
pub mod pump_swap;
|
||||
pub mod raydium_lp_v4;
|
||||
pub mod solfi;
|
||||
pub mod solfi_v2;
|
||||
pub mod vertigo;
|
||||
pub mod virtuals;
|
||||
pub mod woofi;
|
||||
pub mod zero_fi;
|
||||
pub mod zora;
|
||||
mod aldrin_v1;
|
||||
mod aldrin_v2;
|
||||
mod alphaq;
|
||||
mod believe;
|
||||
mod bonk_swap;
|
||||
mod fluxbeam;
|
||||
mod goon_fi;
|
||||
mod goosefx_gamma;
|
||||
mod goosefx_v2;
|
||||
mod guac_swap;
|
||||
mod lifinity_swap_v2;
|
||||
mod metadao_futarchy_amm;
|
||||
mod metadao_v0_5;
|
||||
mod meteora_damm_v1;
|
||||
mod meteora_damm_v2;
|
||||
mod obric_v2;
|
||||
mod one_dex;
|
||||
mod pump_swap;
|
||||
mod raydium_lp_v4;
|
||||
mod solfi;
|
||||
mod solfi_v2;
|
||||
mod vertigo;
|
||||
mod virtuals;
|
||||
mod woofi;
|
||||
mod zero_fi;
|
||||
mod zora;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_aldrin_v1`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_aldrin_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_alphaq`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_believe`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_bonk_swap`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_fluxbeam`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_goon_fi`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_goosefx_gamma`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_goosefx_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_guac_swap`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_lifinity_swap_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_metadao_futarchy_amm`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_metadao_v0_5`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_meteora_damm_v1`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_meteora_damm_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_obric_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_one_dex`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_pump_swap`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_raydium_lp_v4`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_solfi`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_solfi_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_vertigo`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_virtuals`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_woofi`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_zero_fi`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_amm_zora`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
//! `anchor` decoder family.
|
||||
|
||||
pub mod core;
|
||||
mod core;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_anchor`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,45 +3,46 @@
|
||||
|
||||
//! Decoder contracts consolidated from `kb_decoder_api`.
|
||||
|
||||
pub mod contracts;
|
||||
pub mod decoder;
|
||||
mod contracts;
|
||||
mod decoder;
|
||||
|
||||
/// 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.
|
||||
pub use crate::decoder::api::contracts::DecodedObservation;
|
||||
pub use self::contracts::DcApiDecodedObservation;
|
||||
/// Machine-readable decoder coverage declaration.
|
||||
pub use crate::decoder::api::contracts::DecoderCoverageDeclaration;
|
||||
pub use self::contracts::DcApiDecoderCoverageDeclaration;
|
||||
/// Declared decoder coverage entry kind.
|
||||
pub use crate::decoder::api::contracts::DecoderCoverageEntryKind;
|
||||
pub use self::contracts::DcApiDecoderCoverageEntryKind;
|
||||
/// Structured decoder diagnostic.
|
||||
pub use crate::decoder::api::contracts::DecoderDiagnostic;
|
||||
pub use self::contracts::DcApiDecoderDiagnostic;
|
||||
/// Complete decoder execution result.
|
||||
pub use crate::decoder::api::contracts::DecoderExecutionResult;
|
||||
pub use self::contracts::DcApiDecoderExecutionResult;
|
||||
/// Stable decoder identity.
|
||||
pub use crate::decoder::api::contracts::DecoderIdentity;
|
||||
pub use self::contracts::DcApiDecoderIdentity;
|
||||
/// Decoder terminal result status.
|
||||
pub use crate::decoder::api::contracts::DecoderOutcomeStatus;
|
||||
pub use self::contracts::DcApiDecoderOutcomeStatus;
|
||||
/// Explicit decoding proof.
|
||||
pub use crate::decoder::api::contracts::DecoderProof;
|
||||
pub use self::contracts::DcApiDecoderProof;
|
||||
/// Decoding proof category.
|
||||
pub use crate::decoder::api::contracts::DecoderProofKind;
|
||||
pub use self::contracts::DcApiDecoderProofKind;
|
||||
/// Deterministic decoder recognition result.
|
||||
pub use crate::decoder::api::contracts::DecoderRecognition;
|
||||
pub use self::contracts::DcApiDecoderRecognition;
|
||||
/// One statically declared decoder surface.
|
||||
pub use crate::decoder::api::contracts::DecoderSurface;
|
||||
pub use self::contracts::DcApiDecoderSurface;
|
||||
/// Contextual instruction decoder contract.
|
||||
pub use crate::decoder::api::contracts::InstructionDecoder;
|
||||
pub use self::contracts::DcApiInstructionDecoder;
|
||||
/// 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.
|
||||
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.
|
||||
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.
|
||||
pub use crate::decoder::api::contracts::discriminator_8_hex;
|
||||
pub use self::contracts::decoder_api_discriminator_8_hex;
|
||||
/// 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.
|
||||
pub use crate::decoder::api::decoder::InitialDecoder;
|
||||
pub use self::decoder::DcApiInitialDecoder;
|
||||
/// Exposes the common protocol decoder trait.
|
||||
pub use crate::decoder::api::decoder::ProtocolDecoder;
|
||||
pub use self::decoder::DcApiProtocolDecoder;
|
||||
|
||||
@@ -6,18 +6,19 @@
|
||||
use sha2::Digest; // rust-rules: trait-import
|
||||
|
||||
/// 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.
|
||||
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub struct DecoderIdentity {
|
||||
pub struct DcApiDecoderIdentity {
|
||||
/// Stable lower snake case processor name.
|
||||
pub name: std::string::String,
|
||||
/// Semantic or deterministic implementation version.
|
||||
pub version: std::string::String,
|
||||
}
|
||||
|
||||
impl DecoderIdentity {
|
||||
impl DcApiDecoderIdentity {
|
||||
/// Builds a validated decoder identity.
|
||||
pub fn new(
|
||||
name: impl std::convert::Into<std::string::String>,
|
||||
@@ -38,7 +39,7 @@ impl DecoderIdentity {
|
||||
|
||||
/// One statically declared Solana surface supported by a decoder.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub struct DecoderSurface {
|
||||
pub struct DcApiDecoderSurface {
|
||||
/// Exact Solana program identifier.
|
||||
pub program_id: &'static str,
|
||||
/// Stable surface code.
|
||||
@@ -49,7 +50,7 @@ pub struct DecoderSurface {
|
||||
|
||||
/// Declared decoder coverage entry kind.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub enum DecoderCoverageEntryKind {
|
||||
pub enum DcApiDecoderCoverageEntryKind {
|
||||
/// Program instruction entry.
|
||||
Instruction,
|
||||
/// Program event entry.
|
||||
@@ -60,13 +61,13 @@ pub enum DecoderCoverageEntryKind {
|
||||
|
||||
/// Machine-readable decoder coverage declaration.
|
||||
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub struct DecoderCoverageDeclaration {
|
||||
pub struct DcApiDecoderCoverageDeclaration {
|
||||
/// Solana program identifier.
|
||||
pub program_id: std::string::String,
|
||||
/// Optional stable surface code.
|
||||
pub surface_code: std::option::Option<std::string::String>,
|
||||
/// Entry kind.
|
||||
pub entry_kind: DecoderCoverageEntryKind,
|
||||
pub entry_kind: DcApiDecoderCoverageEntryKind,
|
||||
/// Stable instruction, event or discriminator code.
|
||||
pub entry_code: std::string::String,
|
||||
/// Optional normalized lowercase hexadecimal discriminator.
|
||||
@@ -75,12 +76,12 @@ pub struct DecoderCoverageDeclaration {
|
||||
pub historical: bool,
|
||||
}
|
||||
|
||||
impl DecoderCoverageDeclaration {
|
||||
impl DcApiDecoderCoverageDeclaration {
|
||||
/// Builds a validated coverage declaration.
|
||||
pub fn new(
|
||||
program_id: impl std::convert::Into<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>,
|
||||
discriminator_hex: std::option::Option<std::string::String>,
|
||||
historical: bool,
|
||||
@@ -122,7 +123,7 @@ impl DecoderCoverageDeclaration {
|
||||
|
||||
/// Deterministic recognition result used by dispatch.
|
||||
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub struct DecoderRecognition {
|
||||
pub struct DcApiDecoderRecognition {
|
||||
/// Whether the decoder is compatible with the input.
|
||||
pub compatible: bool,
|
||||
/// Whether recognition is exact rather than program-only.
|
||||
@@ -137,7 +138,7 @@ pub struct DecoderRecognition {
|
||||
pub discriminator_hex: std::option::Option<std::string::String>,
|
||||
}
|
||||
|
||||
impl DecoderRecognition {
|
||||
impl DcApiDecoderRecognition {
|
||||
/// Builds a non-compatible recognition result.
|
||||
pub fn incompatible() -> Self {
|
||||
return Self {
|
||||
@@ -171,7 +172,7 @@ impl DecoderRecognition {
|
||||
|
||||
/// Decoder terminal result status.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub enum DecoderOutcomeStatus {
|
||||
pub enum DcApiDecoderOutcomeStatus {
|
||||
/// At least one stable decoded observation was produced.
|
||||
Decoded,
|
||||
/// The decoder intentionally ignored a recognized input.
|
||||
@@ -184,7 +185,7 @@ pub enum DecoderOutcomeStatus {
|
||||
|
||||
/// Proof category attached to one decoded observation.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub enum DecoderProofKind {
|
||||
pub enum DcApiDecoderProofKind {
|
||||
/// Exact instruction discriminator match.
|
||||
ExactDiscriminator,
|
||||
/// Exact binary layout decode.
|
||||
@@ -207,18 +208,18 @@ pub enum DecoderProofKind {
|
||||
|
||||
/// Explicit proof attached to one decoded observation.
|
||||
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub struct DecoderProof {
|
||||
pub struct DcApiDecoderProof {
|
||||
/// Proof category.
|
||||
pub kind: DecoderProofKind,
|
||||
pub kind: DcApiDecoderProofKind,
|
||||
/// Decoder confidence.
|
||||
pub confidence: crate::DecoderConfidence,
|
||||
pub confidence: crate::MdDecoderConfidence,
|
||||
/// Stable evidence strings, hashes or classifier codes.
|
||||
pub evidence: std::vec::Vec<std::string::String>,
|
||||
}
|
||||
|
||||
/// Structured decoder diagnostic without third-party error wrappers.
|
||||
#[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub struct DecoderDiagnostic {
|
||||
pub struct DcApiDecoderDiagnostic {
|
||||
/// Stable machine-readable diagnostic code.
|
||||
pub code: std::string::String,
|
||||
/// Human-readable diagnostic message.
|
||||
@@ -227,7 +228,7 @@ pub struct DecoderDiagnostic {
|
||||
pub retriable: bool,
|
||||
}
|
||||
|
||||
impl DecoderDiagnostic {
|
||||
impl DcApiDecoderDiagnostic {
|
||||
/// Builds a validated decoder diagnostic.
|
||||
pub fn new(
|
||||
code: impl std::convert::Into<std::string::String>,
|
||||
@@ -250,11 +251,11 @@ impl DecoderDiagnostic {
|
||||
|
||||
/// Stable contextual decoded observation persisted by the decode pipeline.
|
||||
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub struct DecodedObservation {
|
||||
pub struct DcApiDecodedObservation {
|
||||
/// Stable processor-owned event key within one input.
|
||||
pub event_key: std::string::String,
|
||||
/// Shared typed protocol event identity.
|
||||
pub event: crate::DecodedProtocolEvent,
|
||||
pub event: crate::MdDecodedProtocolEvent,
|
||||
/// Typed event payload serialized as deterministic JSON.
|
||||
pub payload_json: serde_json::Value,
|
||||
/// Whether the source transaction failed on-chain.
|
||||
@@ -264,10 +265,10 @@ pub struct DecodedObservation {
|
||||
/// Whether the observed state mutation was committed on-chain.
|
||||
pub observation_committed: bool,
|
||||
/// Explicit decoding proof.
|
||||
pub proof: DecoderProof,
|
||||
pub proof: DcApiDecoderProof,
|
||||
}
|
||||
|
||||
impl DecodedObservation {
|
||||
impl DcApiDecodedObservation {
|
||||
/// Validates failed transaction commit semantics and stable identity fields.
|
||||
pub fn validate(&self) -> kb_core::Result<()> {
|
||||
if self.event_key.trim().is_empty() {
|
||||
@@ -295,22 +296,22 @@ impl DecodedObservation {
|
||||
|
||||
/// Complete explicit result produced by one decoder invocation.
|
||||
#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
|
||||
pub struct DecoderExecutionResult {
|
||||
pub struct DcApiDecoderExecutionResult {
|
||||
/// Terminal decoder status.
|
||||
pub status: DecoderOutcomeStatus,
|
||||
pub status: DcApiDecoderOutcomeStatus,
|
||||
/// Optional recognized instruction or discriminator code.
|
||||
pub recognized_entry_code: std::option::Option<std::string::String>,
|
||||
/// Decoded observations.
|
||||
pub observations: std::vec::Vec<DecodedObservation>,
|
||||
pub observations: std::vec::Vec<DcApiDecodedObservation>,
|
||||
/// 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.
|
||||
pub fn unsupported(entry_code: std::option::Option<std::string::String>) -> Self {
|
||||
return Self {
|
||||
status: DecoderOutcomeStatus::Unsupported,
|
||||
status: DcApiDecoderOutcomeStatus::Unsupported,
|
||||
recognized_entry_code: entry_code,
|
||||
observations: std::vec::Vec::new(),
|
||||
diagnostics: std::vec::Vec::new(),
|
||||
@@ -320,7 +321,7 @@ impl DecoderExecutionResult {
|
||||
/// Builds an ignored result.
|
||||
pub fn ignored(entry_code: std::option::Option<std::string::String>) -> Self {
|
||||
return Self {
|
||||
status: DecoderOutcomeStatus::Ignored,
|
||||
status: DcApiDecoderOutcomeStatus::Ignored,
|
||||
recognized_entry_code: entry_code,
|
||||
observations: std::vec::Vec::new(),
|
||||
diagnostics: std::vec::Vec::new(),
|
||||
@@ -329,17 +330,17 @@ impl DecoderExecutionResult {
|
||||
|
||||
/// Validates status and observation consistency.
|
||||
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(
|
||||
"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(
|
||||
"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(
|
||||
"failed decoder status requires at least one diagnostic",
|
||||
));
|
||||
@@ -355,21 +356,24 @@ impl DecoderExecutionResult {
|
||||
}
|
||||
|
||||
/// 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.
|
||||
fn identity(&self) -> DecoderIdentity;
|
||||
fn identity(&self) -> DcApiDecoderIdentity;
|
||||
/// 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.
|
||||
fn coverage(&self) -> std::vec::Vec<DecoderCoverageDeclaration>;
|
||||
fn coverage(&self) -> std::vec::Vec<DcApiDecoderCoverageDeclaration>;
|
||||
/// 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.
|
||||
fn decode(&self, input: &crate::CoreInstructionReplayInput) -> DecoderExecutionResult;
|
||||
fn decode(&self, input: &crate::MdCoreInstructionReplayInput) -> DcApiDecoderExecutionResult;
|
||||
}
|
||||
|
||||
/// 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() {
|
||||
if surface.program_id == program_id {
|
||||
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.
|
||||
pub fn contextual_input_hash(
|
||||
input: &crate::CoreInstructionReplayInput,
|
||||
pub fn decoder_api_decoder_api_contextual_input_hash(
|
||||
input: &crate::MdCoreInstructionReplayInput,
|
||||
) -> kb_core::Result<std::string::String> {
|
||||
let serialization_result = serde_json::to_value(input);
|
||||
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.
|
||||
pub fn deterministic_json_hash(
|
||||
pub fn decoder_api_deterministic_json_hash(
|
||||
value: &mut serde_json::Value,
|
||||
) -> kb_core::Result<std::string::String> {
|
||||
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.
|
||||
pub fn discriminator_8_hex(
|
||||
input: &crate::CoreInstructionReplayInput,
|
||||
pub fn decoder_api_discriminator_8_hex(
|
||||
input: &crate::MdCoreInstructionReplayInput,
|
||||
) -> std::option::Option<std::string::String> {
|
||||
let payload = match &input.instruction_payload_json {
|
||||
std::option::Option::Some(value) => value,
|
||||
@@ -465,8 +469,8 @@ fn sort_json_value(value: &mut serde_json::Value) {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
fn replay_input() -> crate::CoreInstructionReplayInput {
|
||||
let result = crate::CoreInstructionReplayInput::new(
|
||||
fn replay_input() -> crate::MdCoreInstructionReplayInput {
|
||||
let result = crate::MdCoreInstructionReplayInput::new(
|
||||
"signature:0",
|
||||
"signature",
|
||||
42,
|
||||
@@ -497,8 +501,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn contextual_input_hash_is_stable() {
|
||||
let first = crate::contextual_input_hash(&replay_input());
|
||||
let second = crate::contextual_input_hash(&replay_input());
|
||||
let first = crate::decoder_api_decoder_api_contextual_input_hash(&replay_input());
|
||||
let second = crate::decoder_api_decoder_api_contextual_input_hash(&replay_input());
|
||||
assert!(first.is_ok());
|
||||
assert_eq!(first, second);
|
||||
}
|
||||
@@ -514,8 +518,8 @@ mod tests {
|
||||
"payloadJson": {"dataBase64": "CAcGBQQDAgE="},
|
||||
"payloadHash": "different-payload-hash"
|
||||
}]);
|
||||
let first_hash = crate::contextual_input_hash(&first);
|
||||
let second_hash = crate::contextual_input_hash(&second);
|
||||
let first_hash = crate::decoder_api_decoder_api_contextual_input_hash(&first);
|
||||
let second_hash = crate::decoder_api_decoder_api_contextual_input_hash(&second);
|
||||
assert!(first_hash.is_ok());
|
||||
assert!(second_hash.is_ok());
|
||||
assert_ne!(first_hash, second_hash);
|
||||
@@ -538,26 +542,26 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn failed_observation_cannot_be_committed() {
|
||||
let observation = crate::DecodedObservation {
|
||||
let observation = crate::DcApiDecodedObservation {
|
||||
event_key: "event".to_string(),
|
||||
event: crate::DecodedProtocolEvent {
|
||||
signature: crate::Signature("signature".to_string()),
|
||||
slot: crate::Slot(42),
|
||||
instruction_path: crate::InstructionPath("0".to_string()),
|
||||
program_id: crate::ProgramId("program".to_string()),
|
||||
protocol_code: crate::ProtocolCode("solana".to_string()),
|
||||
surface_code: crate::SurfaceCode("system_program".to_string()),
|
||||
event_code: crate::EventCode("system_program.attempt".to_string()),
|
||||
event_name: crate::EventName("attempt".to_string()),
|
||||
event_family: crate::EventFamily::Audit,
|
||||
source_kind: crate::EventSourceKind::Instruction,
|
||||
confidence: crate::DecoderConfidence::Exact,
|
||||
event: crate::MdDecodedProtocolEvent {
|
||||
signature: crate::MdSignature("signature".to_string()),
|
||||
slot: crate::MdSlot(42),
|
||||
instruction_path: crate::MdInstructionPath("0".to_string()),
|
||||
program_id: crate::MdProgramId("program".to_string()),
|
||||
protocol_code: crate::MdProtocolCode("solana".to_string()),
|
||||
surface_code: crate::MdSurfaceCode("system_program".to_string()),
|
||||
event_code: crate::MdEventCode("system_program.attempt".to_string()),
|
||||
event_name: crate::MdEventName("attempt".to_string()),
|
||||
event_family: crate::MdEventFamily::Audit,
|
||||
source_kind: crate::MdEventSourceKind::Instruction,
|
||||
confidence: crate::MdDecoderConfidence::Exact,
|
||||
},
|
||||
payload_json: serde_json::json!({}),
|
||||
transaction_failed: true,
|
||||
@@ -565,9 +569,9 @@ mod tests {
|
||||
serde_json::json!({"InstructionError": [0, "Custom"]}),
|
||||
),
|
||||
observation_committed: true,
|
||||
proof: crate::DecoderProof {
|
||||
kind: crate::DecoderProofKind::ExactLayout,
|
||||
confidence: crate::DecoderConfidence::Exact,
|
||||
proof: crate::DcApiDecoderProof {
|
||||
kind: crate::DcApiDecoderProofKind::ExactLayout,
|
||||
confidence: crate::MdDecoderConfidence::Exact,
|
||||
evidence: std::vec!["layout".to_string()],
|
||||
},
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/// Decoder support level for a program observation.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub enum DecoderSupport {
|
||||
pub enum DcApiDecoderSupport {
|
||||
/// The decoder does not support the observation.
|
||||
No,
|
||||
/// The decoder may support the observation after deeper inspection.
|
||||
@@ -15,7 +15,7 @@ pub enum DecoderSupport {
|
||||
}
|
||||
|
||||
/// Common trait implemented by every protocol decoder crate.
|
||||
pub trait ProtocolDecoder {
|
||||
pub trait DcApiProtocolDecoder {
|
||||
/// Returns the stable decoder name.
|
||||
fn decoder_name(&self) -> &'static str;
|
||||
/// Returns the decoder implementation version.
|
||||
@@ -23,7 +23,7 @@ pub trait ProtocolDecoder {
|
||||
/// Returns the Solana program ids handled by this decoder.
|
||||
fn program_ids(&self) -> &'static [&'static str];
|
||||
/// 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() {
|
||||
if program_id.0.as_str() == *candidate {
|
||||
return true;
|
||||
@@ -32,19 +32,22 @@ pub trait ProtocolDecoder {
|
||||
return false;
|
||||
}
|
||||
/// 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.
|
||||
fn decode_observation(
|
||||
&self,
|
||||
observation: &crate::ProgramObservation,
|
||||
) -> kb_core::Result<std::vec::Vec<crate::DecodedProtocolEvent>>;
|
||||
observation: &crate::MdProgramObservation,
|
||||
) -> kb_core::Result<std::vec::Vec<crate::MdDecodedProtocolEvent>>;
|
||||
}
|
||||
|
||||
/// Initial decoder implementation placeholder for API-level tests.
|
||||
#[derive(Clone, Debug, Default)]
|
||||
pub struct InitialDecoder;
|
||||
pub struct DcApiInitialDecoder;
|
||||
|
||||
impl ProtocolDecoder for InitialDecoder {
|
||||
impl DcApiProtocolDecoder for DcApiInitialDecoder {
|
||||
fn decoder_name(&self) -> &'static str {
|
||||
return "kb_decoder_api";
|
||||
}
|
||||
@@ -57,17 +60,20 @@ impl ProtocolDecoder for InitialDecoder {
|
||||
return &[];
|
||||
}
|
||||
|
||||
fn supports_observation(&self, observation: &crate::ProgramObservation) -> DecoderSupport {
|
||||
if ProtocolDecoder::handles_program_id(self, &observation.program_id) {
|
||||
return DecoderSupport::Maybe;
|
||||
fn supports_observation(
|
||||
&self,
|
||||
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(
|
||||
&self,
|
||||
_observation: &crate::ProgramObservation,
|
||||
) -> kb_core::Result<std::vec::Vec<crate::DecodedProtocolEvent>> {
|
||||
_observation: &crate::MdProgramObservation,
|
||||
) -> kb_core::Result<std::vec::Vec<crate::MdDecodedProtocolEvent>> {
|
||||
return std::result::Result::Ok(std::vec::Vec::new());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
//! `bridge` decoder family.
|
||||
|
||||
pub mod circle_cctp_token_messenger_minter;
|
||||
pub mod circle_cctp_token_messenger_minter_v2;
|
||||
pub mod layer_zero_endpoint;
|
||||
pub mod layer_zero_executor;
|
||||
mod circle_cctp_token_messenger_minter;
|
||||
mod circle_cctp_token_messenger_minter_v2;
|
||||
mod layer_zero_endpoint;
|
||||
mod layer_zero_executor;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_bridge_circle_cctp_token_messenger_minter`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_bridge_circle_cctp_token_messenger_minter_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_bridge_layer_zero_endpoint`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_bridge_layer_zero_executor`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
//! `clmm` decoder family.
|
||||
|
||||
pub mod byreal;
|
||||
pub mod fusion;
|
||||
pub mod orca_whirlpool;
|
||||
pub mod pancake_swap;
|
||||
pub mod raydium;
|
||||
pub mod stabble;
|
||||
mod byreal;
|
||||
mod fusion;
|
||||
mod orca_whirlpool;
|
||||
mod pancake_swap;
|
||||
mod raydium;
|
||||
mod stabble;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_clmm_byreal`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_clmm_fusion`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_clmm_orca_whirlpool`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_clmm_pancake_swap`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_clmm_raydium`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_clmm_stabble`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
//! `cpmm` decoder family.
|
||||
|
||||
pub mod raydium;
|
||||
mod raydium;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_cpmm_raydium`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
//! `dlmm` decoder family.
|
||||
|
||||
pub mod meteora;
|
||||
mod meteora;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_dlmm_meteora`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
|
||||
//! `fees` decoder family.
|
||||
|
||||
pub mod bags_fee_share_v1;
|
||||
pub mod bags_fee_share_v2;
|
||||
mod bags_fee_share_v1;
|
||||
mod bags_fee_share_v2;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_fees_bags_fee_share_v1`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_fees_bags_fee_share_v2`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
|
||||
//! `governance` decoder family.
|
||||
|
||||
pub mod metadao_bid_wall;
|
||||
mod metadao_bid_wall;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_governance_metadao_bid_wall`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
|
||||
//! `launchpad` decoder family.
|
||||
|
||||
pub mod boop_fun;
|
||||
pub mod metadao_ico;
|
||||
pub mod meteora_dbc;
|
||||
pub mod moonit;
|
||||
pub mod orca_wavebreak;
|
||||
pub mod printr;
|
||||
pub mod pump_fun;
|
||||
pub mod pump_pumpup_ai;
|
||||
pub mod raydium_launchlab;
|
||||
mod boop_fun;
|
||||
mod metadao_ico;
|
||||
mod meteora_dbc;
|
||||
mod moonit;
|
||||
mod orca_wavebreak;
|
||||
mod printr;
|
||||
mod pump_fun;
|
||||
mod pump_pumpup_ai;
|
||||
mod raydium_launchlab;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_boop_fun`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_metadao_ico`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_meteora_dbc`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_moonit`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_orca_wavebreak`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_printr`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_pump_fun`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_pump_pumpup_ai`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_launchpad_raydium_launchlab`.
|
||||
|
||||
/// 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.
|
||||
pub const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
const MIGRATION_STATUS: &str = "source-preserved-pending-port";
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
|
||||
//! `lending` decoder family.
|
||||
|
||||
pub mod clone;
|
||||
pub mod jupiter_lend_borrow;
|
||||
pub mod jupiter_lend_earn;
|
||||
pub mod jupiter_lend_flash_loan;
|
||||
pub mod jupiter_lend_liquidity;
|
||||
pub mod kamino;
|
||||
pub mod marginfi_v2;
|
||||
mod clone;
|
||||
mod jupiter_lend_borrow;
|
||||
mod jupiter_lend_earn;
|
||||
mod jupiter_lend_flash_loan;
|
||||
mod jupiter_lend_liquidity;
|
||||
mod kamino;
|
||||
mod marginfi_v2;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! Migration boundary for legacy crate `kb_decoder_lending_clone`.
|
||||
|
||||
/// 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.
|
||||
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
Reference in New Issue
Block a user