v0.1.0-pre.062
This commit is contained in:
@@ -17,6 +17,10 @@ KB_POSTGRES_TEST_URL=postgres://solana:solana@localhost:5432/khadhroony_test
|
||||
# Optional configuration-file override.
|
||||
# KB_CONFIG_PATH=config/example.config.json
|
||||
|
||||
# Optional Devnet profile selected by CLI and opt-in scenario tests.
|
||||
# When absent, the first compatible Devnet profile is selected.
|
||||
# KB_DEVNET_PROFILE=local_devnet
|
||||
|
||||
# Optional Token-2022 Devnet validation fixtures.
|
||||
TOKEN_2022_PROGRAM=TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
|
||||
TOKEN_2022_MINT=
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -44,6 +44,9 @@ var/
|
||||
|
||||
config.json
|
||||
|
||||
# Runtime wallets and private keypairs
|
||||
/wallets/
|
||||
|
||||
# bindings TS-rs
|
||||
bindings/
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: KHADHROONY_BOT3_MIGRATION_CLOSURE_TODO.md -->
|
||||
<!-- version: 19 -->
|
||||
<!-- version: 25 -->
|
||||
|
||||
# Clôture de la migration `khadhroony-bot3`
|
||||
|
||||
@@ -39,8 +39,43 @@ Ce fichier est temporaire. Il doit disparaître lorsque la migration est close,
|
||||
- [x] Les trois erreurs supplémentaires du replay ont été identifiées comme timeouts transitoires du pool PostgreSQL, distincts des échecs fonctionnels de décodage.
|
||||
- [x] Revalider les suites après les correctifs `pre.061-delta-fix-004` et `pre.061-delta-fix-005` : 116 tests desktop, 625 tests `kb-lib`, suites consolidées et replay propre.
|
||||
|
||||
# 0. `0.1.0-pre.062` — validation Devnet
|
||||
|
||||
- [x] Séparer les DSN PostgreSQL Mainnet, Devnet et tests par variables d’environnement.
|
||||
- [x] Résoudre les profils Devnet sans dépendre du nom historique `local_devnet`.
|
||||
- [x] Autoriser une sélection explicite par l’interface ou `KB_DEVNET_PROFILE` pour les scénarios CLI/tests.
|
||||
- [x] À l’ouverture des fenêtres Exécution Solana Core et Exécution SPL, connecter la base du profil sélectionné.
|
||||
- [x] Créer les tables manquantes uniquement lorsque `auto_initialize_schema` l’autorise.
|
||||
- [x] Refuser l’activation des commandes Devnet lorsque PostgreSQL est désactivé, non PostgreSQL ou incomplet.
|
||||
- [x] Valider visuellement la préparation de la base Devnet dans les deux fenêtres : seul le profil `local_devnet` est proposé et les 13 tables PostgreSQL sont créées ou détectées.
|
||||
- [ ] Exécuter les scénarios Devnet selon `docs/DEVNET_EXECUTION_GUIDE.md`.
|
||||
- [x] Préparer le terminal Bash de contrôle et stocker les preuves sous `/tmp/devnet-validation/pre.062`.
|
||||
- [x] Vérifier les CLI Solana/Agave et le genesis hash Devnet.
|
||||
- [x] Financer le wallet persistant `local_devnet` via faucet Web.
|
||||
- [x] Valider le transfert System de bout en bout : simulation, envoi, confirmation, balances, backfill, Core extraction et Decode replay sans erreur.
|
||||
- [x] Valider SPL Memo v4 : simulation, confirmation finalisée, backfill, Core extraction, Decode replay, matérialisation et idempotence validés.
|
||||
- [ ] Valider ATA et SPL Token classique.
|
||||
- [ ] Valider ATA et scénarios Token-2022.
|
||||
- [ ] Valider registre ElGamal selon les prérequis disponibles.
|
||||
|
||||
|
||||
# 1. Nettoyage structurel et nomenclature
|
||||
|
||||
## 1.0 Convention globale des identités persistées
|
||||
|
||||
- [x] Arrêter la notation hiérarchique par points pour les identités runtime et les codes persistés.
|
||||
- [x] Ajouter la documentation normative `docs/OPERATION_NAMING_CONVENTION.md`.
|
||||
- [x] Ajouter la matrice machine-readable `test-fixtures/contract-matrices/OPERATION_NAMING_MATRIX.json`.
|
||||
- [x] Migrer les constantes et attentes actives de Solana Core, SPL Memo, SPL Token, Token-2022, ATA, registre ElGamal et Metaplex vers la notation canonique.
|
||||
- [x] Ajouter une règle courte renvoyant vers la documentation et la matrice.
|
||||
- [ ] Purger ou recréer la base `solana_devnet`, puis rejouer les preuves System Transfer et Memo v4 avec les nouveaux codes.
|
||||
- [ ] Ajouter un audit final empêchant la réintroduction des anciennes valeurs contractuelles.
|
||||
- [x] Corriger la frontière entre codes de registre `lower_snake_case` et identités persistées en notation par points.
|
||||
- [x] Corriger le test de matrice pour rester propre sous Clippy sans assertion constante fausse.
|
||||
- [x] Corriger la référence IDL Metaplex vers le nom canonique local.
|
||||
- [x] Documenter quelles surfaces actives disposent réellement d’une IDL officielle et lesquelles reposent sur des crates d’interface.
|
||||
|
||||
|
||||
## 1.1 Règles
|
||||
|
||||
- [x] Reprendre dans les règles Bot3 toutes les règles Bot2 encore applicables.
|
||||
@@ -72,7 +107,7 @@ Convention arrêtée :
|
||||
- symboles, modules, fichiers, fonctions et variables internes : `token_2022` / `TOKEN_2022` ;
|
||||
- types et variantes Rust en PascalCase : `Token2022` ;
|
||||
- valeurs JSON/TS explicitement concernées : `token_2022` avec attributs Serde et TS-RS ;
|
||||
- codes persistés : `spl_token_2022` ;
|
||||
- codes persistés : `spl.token_2022` et opérations sous `spl.token_2022.*` ;
|
||||
- noms officiels externes : conserver leur orthographe publiée ;
|
||||
- exceptions contractuelles Metaplex conservées : `token2022EmbeddedMetadata` et `token2022_embedded_metadata`.
|
||||
|
||||
@@ -81,7 +116,7 @@ Convention arrêtée :
|
||||
- [x] Renommer les symboles et modules internes vers `token_2022` / `TOKEN_2022`.
|
||||
- [x] Conserver `Token2022` pour les types et variantes Rust.
|
||||
- [x] Aligner Serde et TS-RS sur `token_2022` lorsque cette valeur appartient au contrat applicatif.
|
||||
- [x] Renommer les identités persistées et runtime vers `spl_token_2022` et `kb-lib.*.token_2022`.
|
||||
- [x] Renommer les identités persistées et runtime vers `spl.token_2022` et `kb-lib.*.token_2022`.
|
||||
- [x] Purger les données dérivées puis reconstruire Core, Decode et Materialize depuis les 4 574 raws.
|
||||
- [x] Valider 55 instructions Token-2022 décodées, 0 échec fonctionnel.
|
||||
- [x] Vérifier les matrices actives ; corriger la dernière commande historique dans `SPL_TOKEN_2022_MATRIX.json`.
|
||||
@@ -387,3 +422,15 @@ L’ancien bloc `docs/IDL_SOURCES.md` n’est pas un prérequis autonome puisque
|
||||
- [ ] `USAGE.md` disponibles pour les surfaces publiques et binaires.
|
||||
- [ ] Workspace aligné sur `0.4.7`.
|
||||
- [ ] Cette checklist est supprimée.
|
||||
|
||||
### 0.1.0-pre.062 — séparation du socle Devnet commun
|
||||
|
||||
- [x] Garder `kb-app-demo-desktop/src/tauri.rs` comme couche mince de wrappers `#[tauri::command]`.
|
||||
- [x] Déplacer `DemoExecutionDevnetStoreReadinessPayload`, `bounded_u32` et `prepare_devnet_profile_store` dans `kb-app-demo-desktop/src/demo_devnet_common.rs`.
|
||||
- [x] Revalider `cargo fmt --all`, `cargo test -p kb-app-demo-desktop -p kb-pipeline-demo-scenarios`, `cargo check --workspace` et `cargo clippy --all-targets` : 117 tests desktop et 37 tests scénarios réussis.
|
||||
- [x] Renommer l’en-tête du menu desktop `Exécution` en `Exécution Devnet`.
|
||||
- [x] Déplacer l’idée de profils de logging indépendants vers `docs/IDEA_REMINDERS.md` sans ouvrir de développement dans `pre.062`.
|
||||
- [x] Corriger l’audit d’ordre des exports pour le cas lexical Token-2022 sans imposer un réordonnancement contraire à rustfmt.
|
||||
- [x] Aligner les tests `kb-store` sur `materializer.transaction.annotations`.
|
||||
- [x] Réorganiser `docs/DEVNET_EXECUTION_GUIDE.md` autour de commandes communes référencées et de scénarios Devnet séparés.
|
||||
|
||||
|
||||
@@ -235,3 +235,11 @@ Les `program_id` connus doivent être définis une seule fois dans `kb-program-i
|
||||
- `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.
|
||||
- Seul `kb-app-demo-desktop` est conservé comme binaire pendant la migration initiale.
|
||||
|
||||
## Nomenclature des identités et opérations persistées
|
||||
|
||||
- Les identités runtime, `processor_name`, `protocol_code`, `surface_code`, `operation_code` et `event_code` sont des contrats persistés et utilisent des segments hiérarchiques séparés par `.`.
|
||||
- Chaque segment utilise `snake_case`; un underscore ne remplace jamais un niveau hiérarchique. Exemples : `solana.core.system.transfer`, `spl.memo.v4.add_memo`, `spl.token_2022.transfer_checked`.
|
||||
- Les anciennes formes préfixées par `solana_core`, `solana_native`, `spl_memo`, `spl_token`, `spl_token_2022`, `spl_associated_token_account` ou `metadata_metaplex_token_metadata` sont interdites pour ces valeurs contractuelles.
|
||||
- Toute nouvelle surface ou opération doit respecter `docs/OPERATION_NAMING_CONVENTION.md` et être ajoutée à `test-fixtures/contract-matrices/OPERATION_NAMING_MATRIX.json` avant son premier remplissage persistant.
|
||||
- Un renommage de ces valeurs après remplissage d’une base est une migration de données et exige une migration SQL ou une reconstruction explicite des tables dérivées.
|
||||
|
||||
@@ -1,110 +1,791 @@
|
||||
<!-- file: docs/DEVNET_EXECUTION_GUIDE.md -->
|
||||
<!-- version: 3 -->
|
||||
<!-- version: 19 -->
|
||||
|
||||
# Guide d’exécution Devnet
|
||||
|
||||
## 1. Objet
|
||||
## 1. Objet et ordre de validation
|
||||
|
||||
Ce guide est créé avant la campagne Devnet puis corrigé pendant les essais réels. Il décrit uniquement les scénarios exposés par `kb-app-demo-desktop` et `kb-pipeline-demo-scenarios`.
|
||||
Ce guide décrit la campagne Devnet de `kb-app-demo-desktop` et `kb-pipeline-demo-scenarios`. Après une modification de nomenclature persistée ou une recréation de la base Devnet, reprendre les scénarios depuis le début dans l’ordre suivant :
|
||||
|
||||
## 2. Préparation du profil
|
||||
1. préparation commune et base PostgreSQL propre ;
|
||||
2. Solana Core — System Transfer ;
|
||||
3. SPL Memo v4 ;
|
||||
4. SPL Associated Token Account — mint Token classique ;
|
||||
5. SPL Associated Token Account — mint Token-2022 ;
|
||||
6. SPL Token classique ;
|
||||
7. Token-2022 ;
|
||||
8. registre ElGamal.
|
||||
|
||||
1. Copier `.env.example` vers `.env` et renseigner au minimum `KB_POSTGRES_DEVNET_URL`.
|
||||
2. Vérifier que `KB_POSTGRES_DEVNET_URL`, `KB_POSTGRES_MAINNET_URL` et `KB_POSTGRES_TEST_URL` désignent trois bases distinctes.
|
||||
3. Sélectionner le profil `local_devnet` ou le profil Devnet explicitement autorisé dans `example.config.json`.
|
||||
4. Vérifier que l’envoi mainnet reste désactivé.
|
||||
5. Vérifier les plafonds de frais, de dépense et les politiques `simulation-first`.
|
||||
6. Démarrer l’application avec la configuration de développement attendue.
|
||||
7. Contrôler dans la fenêtre Configuration que `local_devnet` utilise bien la base Devnet et non la base Mainnet.
|
||||
Les commandes réutilisables sont centralisées en section 4. Chaque scénario référence leur identifiant `Cxx` au lieu de les recopier.
|
||||
|
||||
## 3. Wallet de démonstration
|
||||
## 2. Préconditions
|
||||
|
||||
Créer un wallet dédié avec les outils Solana installés localement, conserver le fichier hors du dépôt et vérifier ses permissions privées. Relever la pubkey sans copier la clé privée dans l’interface ou les logs.
|
||||
- `.env` contient `KB_POSTGRES_DEVNET_URL` et les secrets de transport requis ;
|
||||
- `KB_POSTGRES_DEVNET_URL`, `KB_POSTGRES_MAINNET_URL` et `KB_POSTGRES_TEST_URL` désignent des bases distinctes ;
|
||||
- le profil sélectionné est Devnet et autorise explicitement l’envoi Devnet ;
|
||||
- l’envoi Mainnet reste désactivé ;
|
||||
- les plafonds de frais, de dépense et de rent sont contrôlés ;
|
||||
- la politique reste `simulation-first` ;
|
||||
- le wallet temporaire persistant n’est jamais copié dans les logs ou les preuves ;
|
||||
- le financement est réalisé par un faucet Web Devnet, pas par `solana airdrop`.
|
||||
|
||||
Champs à consigner pendant les tests :
|
||||
Lorsque `database.postgres.auto_initialize_schema` vaut `true`, l’ouverture d’une fenêtre Devnet crée les tables manquantes. Lorsqu’il vaut `false`, le schéma doit être préparé avant l’ouverture.
|
||||
|
||||
- alias du wallet ;
|
||||
- pubkey ;
|
||||
- cluster ;
|
||||
- solde initial ;
|
||||
- source de financement Devnet ;
|
||||
- date du test.
|
||||
## 3. Organisation des terminaux
|
||||
|
||||
## 4. Financement Devnet
|
||||
La campagne utilise deux terminaux distincts. Les variables d’environnement exportées dans un terminal ne sont pas visibles dans l’autre.
|
||||
|
||||
Le financement doit être réalisé avec un faucet Web Devnet. La commande `solana airdrop` n’est pas considérée comme une procédure valide dans l’environnement de validation. Fournir uniquement la pubkey au faucet, ne jamais transmettre le fichier du wallet ni sa clé privée, puis vérifier le solde via la fenêtre HTTP ou une lecture RPC non mutable.
|
||||
### Terminal A — application Tauri
|
||||
|
||||
## 5. Ordre des tests existants
|
||||
Ce terminal reste occupé par `cargo tauri dev` pendant toute la campagne. Il affiche les logs Rust, Tauri, Vite, PostgreSQL et RPC.
|
||||
|
||||
### 5.1 Solana Core
|
||||
### Terminal B — contrôles CLI et preuves
|
||||
|
||||
- génération d’un destinataire ;
|
||||
- transfert System en simulation ;
|
||||
- envoi après confirmation opérateur ;
|
||||
- confirmation réseau ;
|
||||
- extraction Core ciblée ;
|
||||
- Decode replay ciblé ;
|
||||
- vérification des projections.
|
||||
Ce terminal reste disponible pour les commandes Solana, PostgreSQL, balances, confirmations et captures avec `tee`.
|
||||
|
||||
### 5.2 SPL Memo v4
|
||||
Les commandes `C01` à `C05` doivent être exécutées dans le terminal B. Le terminal A doit exécuter `T01`, puis rester ouvert. Avant chaque scénario, le terminal B doit définir `KB_DEVNET_SCENARIO` avant d’appeler `C06`.
|
||||
|
||||
- saisir un texte borné ;
|
||||
- vérifier le plan et les signers ;
|
||||
- simuler ;
|
||||
- envoyer ;
|
||||
- confirmer ;
|
||||
- vérifier l’annotation de transaction et l’idempotence du replay.
|
||||
## 4. Commandes communes
|
||||
|
||||
### 5.3 SPL Token classique
|
||||
Les commandes suivantes sont exécutées depuis la racine du workspace dans un terminal interactif. Ne pas utiliser `set -e` ou `set -u` dans ce terminal : une commande de contrôle non satisfaite fermerait la session. `set -o pipefail` est suffisant pour fiabiliser les pipelines vers `tee`.
|
||||
|
||||
- préparer mint et comptes contrôlés ;
|
||||
- exécuter les scénarios non destructifs avant le lifecycle complet ;
|
||||
- documenter chaque signature et chaque solde brut avant/après ;
|
||||
- vérifier replay et matérialisation.
|
||||
### T01 — Démarrer l’application dans le terminal A
|
||||
|
||||
### 5.4 ATA
|
||||
Premier lancement du workspace ou après modification des dépendances frontend :
|
||||
|
||||
- dériver l’ATA classique et Token-2022 ;
|
||||
- simuler la création idempotente ;
|
||||
- envoyer uniquement après contrôle du payer et du plafond de rent ;
|
||||
- vérifier la projection lifecycle.
|
||||
```bash
|
||||
cd ~/Projects/khadhroony-bot3; command -v cargo; command -v npm; command -v cargo-tauri || cargo install tauri-cli --locked; test -d kb-app-demo-desktop/node_modules || npm --prefix kb-app-demo-desktop i; cargo tauri dev -c kb-app-demo-desktop/tauri.conf.json
|
||||
```
|
||||
|
||||
### 5.5 Token-2022 et registre ElGamal
|
||||
La commande `npm --prefix kb-app-demo-desktop i -D ...` installe ou réaligne explicitement les dépendances de développement déclarées par l’application. `npm --prefix kb-app-demo-desktop i` reste nécessaire pour les dépendances runtime.
|
||||
|
||||
- utiliser uniquement les scénarios explicitement disponibles dans l’interface ;
|
||||
- conserver les preuves de préflight, comptes, extensions et signers ;
|
||||
- distinguer registre ElGamal et programme Token-2022 ;
|
||||
- vérifier les projections admin, token, fee, metadata et risk attendues.
|
||||
Installation ou réalignement conditionnel des dépendances de développement, uniquement après modification de `package.json`, suppression de `node_modules` ou erreur de dépendance frontend :
|
||||
|
||||
## 6. Future fenêtre Metadata
|
||||
```bash
|
||||
npm --prefix kb-app-demo-desktop i -D @tauri-apps/cli @types/bootstrap @types/markdown-it @types/node sass-embedded typescript vite
|
||||
```
|
||||
|
||||
La fenêtre `demo_execution_metadata` sera ajoutée avec le pipeline metadata général. L’ordre prévu est :
|
||||
`npm run dev` est lancé automatiquement par Tauri via `beforeDevCommand`; il exécute le script `dev` du `package.json`, actuellement Vite. Il ne faut pas le lancer dans un troisième terminal.
|
||||
|
||||
1. SPL Token Metadata incorporé à Token-2022 ;
|
||||
2. programme Metaplex Token Metadata ;
|
||||
3. éventuel enrichissement off-chain via `kb-offchain-transport`, sans couplage au replay canonique.
|
||||
La validation frontend de cette campagne est effectuée par `cargo tauri dev -c kb-app-demo-desktop/tauri.conf.json`, qui lance Vite. Ne pas ajouter `npm --prefix kb-app-demo-desktop run build` à la procédure.
|
||||
|
||||
## 7. Preuves à conserver par scénario
|
||||
Lancements suivants, lorsque `cargo-tauri` et `node_modules` sont déjà présents :
|
||||
|
||||
- profil et cluster ;
|
||||
```bash
|
||||
cd ~/Projects/khadhroony-bot3; cargo tauri dev -c kb-app-demo-desktop/tauri.conf.json
|
||||
```
|
||||
|
||||
Attendre avant tout scénario :
|
||||
|
||||
- le démarrage de Vite ;
|
||||
- le lancement du binaire `kb-app-demo-desktop` ;
|
||||
- l’ouverture de la fenêtre ;
|
||||
- le message PostgreSQL indiquant que les 13 tables sont prêtes ;
|
||||
- la résolution correcte du profil `local_devnet`.
|
||||
|
||||
Ne pas exécuter les commandes `C06` ou `C07` dans ce terminal.
|
||||
|
||||
### T02 — Arrêter et redémarrer Tauri conditionnellement
|
||||
|
||||
Redémarrer Tauri après :
|
||||
|
||||
- recréation du schéma PostgreSQL si l’application était déjà ouverte ;
|
||||
- modification de `.env`, de la configuration ou du profil actif ;
|
||||
- recompilation liée à une correction de code ;
|
||||
- perte de connexion entre Vite et la fenêtre.
|
||||
|
||||
Arrêter avec `Ctrl+C`, puis relancer `T01`.
|
||||
|
||||
### C01 — Initialiser l’environnement de validation
|
||||
|
||||
```bash
|
||||
cd ~/Projects/khadhroony-bot3 && set -o pipefail && export KB_DEVNET_PROFILE="local_devnet" && export KB_DEVNET_RPC_URL="https://api.devnet.solana.com" && export KB_DEVNET_VALIDATION_DIR="/tmp/devnet-validation/pre.062-clean" && export KB_DEVNET_WALLET="$PWD/wallets/temporary/local_devnet/local-devnet-operator.json" && mkdir -p "$KB_DEVNET_VALIDATION_DIR" && printf 'Profil : %s\n' "$KB_DEVNET_PROFILE" && printf 'RPC Devnet : %s\n' "$KB_DEVNET_RPC_URL" && printf 'Preuves : %s\n' "$KB_DEVNET_VALIDATION_DIR" && printf 'Wallet : %s\n' "$KB_DEVNET_WALLET";
|
||||
```
|
||||
|
||||
### C02 — Capturer les versions CLI
|
||||
|
||||
```bash
|
||||
command -v solana && command -v solana-keygen && command -v spl-token && { date --iso-8601=seconds; solana --version; solana-keygen --version; spl-token --version; } | tee "$KB_DEVNET_VALIDATION_DIR/00-cli-versions.txt";
|
||||
```
|
||||
|
||||
La première campagne `pre.062` utilisait `solana-cli 4.0.2`, `solana-keygen 4.0.2` et `spl-token-cli 5.5.0`. Une nouvelle campagne doit capturer ses propres versions.
|
||||
|
||||
### C03 — Vérifier l’identité du réseau
|
||||
|
||||
```bash
|
||||
solana config set --url "$KB_DEVNET_RPC_URL" && { date --iso-8601=seconds; solana config get; solana cluster-version --url "$KB_DEVNET_RPC_URL"; solana genesis-hash --url "$KB_DEVNET_RPC_URL"; solana epoch-info --url "$KB_DEVNET_RPC_URL"; } | tee "$KB_DEVNET_VALIDATION_DIR/01-devnet-network.txt";
|
||||
```
|
||||
|
||||
Le genesis hash Devnet attendu est :
|
||||
|
||||
```text
|
||||
EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG
|
||||
```
|
||||
|
||||
### C04 — Vérifier le wallet opérateur
|
||||
|
||||
```bash
|
||||
test -f "$KB_DEVNET_WALLET" && chmod 600 "$KB_DEVNET_WALLET" && export KB_DEVNET_WALLET_PUBKEY="$(solana-keygen pubkey "$KB_DEVNET_WALLET")" && { date --iso-8601=seconds; printf 'wallet_path=%s\n' "$KB_DEVNET_WALLET"; printf 'wallet_pubkey=%s\n' "$KB_DEVNET_WALLET_PUBKEY"; solana balance "$KB_DEVNET_WALLET_PUBKEY" --url "$KB_DEVNET_RPC_URL" --commitment confirmed; } | tee "$KB_DEVNET_VALIDATION_DIR/02-wallet.txt"
|
||||
```
|
||||
|
||||
### C05 — Recréer la base Devnet
|
||||
|
||||
Cette commande est destructive. Elle ne doit viser que `KB_POSTGRES_DEVNET_URL`. Elle supprime toutes les données et tous les objets du schéma `public`, puis laisse l’application recréer son schéma lors de l’ouverture d’une fenêtre Devnet.
|
||||
|
||||
```bash
|
||||
test -n "$KB_POSTGRES_DEVNET_URL" && printf '%s\n' "$KB_POSTGRES_DEVNET_URL" && export KB_CONFIRM_DEVNET_DATABASE_RESET="YES_RESET_SOLANA_DEVNET" && test "$KB_CONFIRM_DEVNET_DATABASE_RESET" = "YES_RESET_SOLANA_DEVNET" && psql "$KB_POSTGRES_DEVNET_URL" -v ON_ERROR_STOP=1 -c 'DROP SCHEMA public CASCADE; CREATE SCHEMA public;'
|
||||
```
|
||||
|
||||
Après ouverture d’une fenêtre Devnet, contrôler les tables :
|
||||
|
||||
```bash
|
||||
psql "$KB_POSTGRES_DEVNET_URL" -v ON_ERROR_STOP=1 -c "SELECT schemaname, tablename FROM pg_tables WHERE schemaname = 'public' ORDER BY tablename;" | tee "$KB_DEVNET_VALIDATION_DIR/03-devnet-schema.txt"
|
||||
```
|
||||
|
||||
### C06 — Capturer le solde avant scénario
|
||||
|
||||
Définir `KB_DEVNET_SCENARIO` avant l’appel.
|
||||
|
||||
```bash
|
||||
test -n "${KB_DEVNET_SCENARIO:-}" && test -n "${KB_DEVNET_WALLET_PUBKEY:-}" && test -n "${KB_DEVNET_RPC_URL:-}" && test -n "${KB_DEVNET_VALIDATION_DIR:-}" && { date --iso-8601=seconds; printf 'scenario=%s\nwallet=%s\n' "$KB_DEVNET_SCENARIO" "$KB_DEVNET_WALLET_PUBKEY"; solana balance "$KB_DEVNET_WALLET_PUBKEY" --url "$KB_DEVNET_RPC_URL" --commitment confirmed; } | tee "$KB_DEVNET_VALIDATION_DIR/${KB_DEVNET_SCENARIO}-wallet-before.txt"
|
||||
```
|
||||
|
||||
### C07 — Confirmer une signature et capturer le solde après scénario
|
||||
|
||||
Définir `KB_DEVNET_SCENARIO` et `KB_DEVNET_SIGNATURE` avant l’appel.
|
||||
|
||||
```bash
|
||||
test -n "${KB_DEVNET_SCENARIO:-}" && test -n "${KB_DEVNET_SIGNATURE:-}" && test -n "${KB_DEVNET_WALLET_PUBKEY:-}" && test -n "${KB_DEVNET_RPC_URL:-}" && test -n "${KB_DEVNET_VALIDATION_DIR:-}" && { date --iso-8601=seconds; printf 'scenario=%s\nsignature=%s\n' "$KB_DEVNET_SCENARIO" "$KB_DEVNET_SIGNATURE"; solana confirm "$KB_DEVNET_SIGNATURE" --url "$KB_DEVNET_RPC_URL" --commitment finalized --verbose; solana balance "$KB_DEVNET_WALLET_PUBKEY" --url "$KB_DEVNET_RPC_URL" --commitment confirmed; } | tee "$KB_DEVNET_VALIDATION_DIR/${KB_DEVNET_SCENARIO}-confirmation.txt"
|
||||
```
|
||||
|
||||
### C08 — Préparer un mint SPL Token classique pour ATA
|
||||
|
||||
Cette commande crée uniquement un mint de test persistant. Elle ne crée aucun compte token associé : l’ATA doit être dérivé, simulé et créé par `kb-app-demo-desktop`.
|
||||
|
||||
L’option `--silent` est obligatoire afin que la phrase de récupération ne soit pas affichée dans le terminal, les captures ou l’historique de validation.
|
||||
|
||||
La commande est idempotente au niveau du guide : si le compte du mint existe déjà sur Devnet, elle le réutilise.
|
||||
|
||||
```bash
|
||||
export KB_SPL_TOKEN_PROGRAM_ID="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" && export KB_DEVNET_CLASSIC_MINT_KEYPAIR="$PWD/wallets/temporary/local_devnet/mints/ata-classic-mint.json" && mkdir -p "$(dirname "$KB_DEVNET_CLASSIC_MINT_KEYPAIR")" && { test -f "$KB_DEVNET_CLASSIC_MINT_KEYPAIR" || solana-keygen new --no-bip39-passphrase --force --silent --outfile "$KB_DEVNET_CLASSIC_MINT_KEYPAIR"; }
|
||||
```
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_CLASSIC_MINT="$(solana-keygen pubkey "$KB_DEVNET_CLASSIC_MINT_KEYPAIR")" && { solana account "$KB_DEVNET_CLASSIC_MINT" --url "$KB_DEVNET_RPC_URL" --output json >/dev/null 2>&1 || spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" create-token "$KB_DEVNET_CLASSIC_MINT_KEYPAIR" --decimals 9; } && printf 'classic_mint=%s\n' "$KB_DEVNET_CLASSIC_MINT" | tee "$KB_DEVNET_VALIDATION_DIR/30a-spl-ata-classic-mint.txt"
|
||||
```
|
||||
|
||||
### C09 — Préparer un mint Token-2022 pour ATA
|
||||
|
||||
Cette commande crée uniquement un mint Token-2022 de test persistant, sans extension supplémentaire. Elle ne crée aucun ATA.
|
||||
|
||||
```bash
|
||||
export KB_SPL_TOKEN_2022_PROGRAM_ID="TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" && export KB_DEVNET_TOKEN_2022_MINT_KEYPAIR="$PWD/wallets/temporary/local_devnet/mints/ata-token-2022-mint.json" && mkdir -p "$(dirname "$KB_DEVNET_TOKEN_2022_MINT_KEYPAIR")" && { test -f "$KB_DEVNET_TOKEN_2022_MINT_KEYPAIR" || solana-keygen new --no-bip39-passphrase --force --silent --outfile "$KB_DEVNET_TOKEN_2022_MINT_KEYPAIR"; }
|
||||
```
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_TOKEN_2022_MINT="$(solana-keygen pubkey "$KB_DEVNET_TOKEN_2022_MINT_KEYPAIR")" && { solana account "$KB_DEVNET_TOKEN_2022_MINT" --url "$KB_DEVNET_RPC_URL" --output json >/dev/null 2>&1 || spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_2022_PROGRAM_ID" create-token "$KB_DEVNET_TOKEN_2022_MINT_KEYPAIR" --decimals 9; } && printf 'token_2022_mint=%s\n' "$KB_DEVNET_TOKEN_2022_MINT" | tee "$KB_DEVNET_VALIDATION_DIR/30b-spl-ata-token-2022-mint.txt"
|
||||
```
|
||||
|
||||
### C10 — Préparer les comptes du scénario SPL Token classique
|
||||
|
||||
La fenêtre actuelle **Décodeur spl_token — TransferChecked** valide uniquement `TransferChecked`. Elle exige :
|
||||
|
||||
- un mint SPL Token classique ;
|
||||
- un compte source appartenant au wallet opérateur et possédant un solde token suffisant ;
|
||||
- un compte destination distinct pour le même mint ;
|
||||
- l’autorité simple du compte source, qui doit être le wallet opérateur.
|
||||
|
||||
Cette préparation réutilise le mint créé par `C08` et l’ATA classique créée pendant `S03A`.
|
||||
|
||||
1. Dériver l’ATA source avec la syntaxe exigée par `spl-token-cli 5.5.0` :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_CLASSIC_SOURCE_ATA="$(spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" address --verbose --token "$KB_DEVNET_CLASSIC_MINT" --owner "$KB_DEVNET_WALLET_PUBKEY" | awk -F': ' '/Associated token address/ {print $2}')" && test -n "$KB_DEVNET_CLASSIC_SOURCE_ATA" && printf 'source_ata=%s\n' "$KB_DEVNET_CLASSIC_SOURCE_ATA"
|
||||
```
|
||||
|
||||
2. Préparer un owner destinataire persistant :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_CLASSIC_RECIPIENT_KEYPAIR="$PWD/wallets/temporary/local_devnet/recipients/spl-token-transfer-recipient.json" && mkdir -p "$(dirname "$KB_DEVNET_CLASSIC_RECIPIENT_KEYPAIR")" && { test -f "$KB_DEVNET_CLASSIC_RECIPIENT_KEYPAIR" || solana-keygen new --no-bip39-passphrase --force --silent --outfile "$KB_DEVNET_CLASSIC_RECIPIENT_KEYPAIR"; } && export KB_DEVNET_CLASSIC_RECIPIENT="$(solana-keygen pubkey "$KB_DEVNET_CLASSIC_RECIPIENT_KEYPAIR")"
|
||||
```
|
||||
|
||||
3. Dériver puis créer l’ATA destination si elle n’existe pas :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_CLASSIC_DESTINATION_ATA="$(spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" address --verbose --token "$KB_DEVNET_CLASSIC_MINT" --owner "$KB_DEVNET_CLASSIC_RECIPIENT" | awk -F': ' '/Associated token address/ {print $2}')" && test -n "$KB_DEVNET_CLASSIC_DESTINATION_ATA" && { solana account "$KB_DEVNET_CLASSIC_DESTINATION_ATA" --url "$KB_DEVNET_RPC_URL" --output json >/dev/null 2>&1 || spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" create-account "$KB_DEVNET_CLASSIC_MINT" --owner "$KB_DEVNET_CLASSIC_RECIPIENT" --fee-payer "$KB_DEVNET_WALLET"; }
|
||||
```
|
||||
|
||||
4. Créditer le compte source. Cette commande ajoute `10` tokens à chaque exécution ; ne la relancer que si le solde source est insuffisant :
|
||||
|
||||
```bash
|
||||
spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" mint "$KB_DEVNET_CLASSIC_MINT" 10 "$KB_DEVNET_CLASSIC_SOURCE_ATA" --owner "$KB_DEVNET_WALLET" --fee-payer "$KB_DEVNET_WALLET"
|
||||
```
|
||||
|
||||
5. Afficher les comptes par leur adresse. Avec cette version du CLI, utiliser `display` plutôt que `account-info <adresse>`, car l’argument positionnel de `account-info` est interprété comme un mint :
|
||||
|
||||
```bash
|
||||
spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" display "$KB_DEVNET_CLASSIC_SOURCE_ATA" && spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" display "$KB_DEVNET_CLASSIC_DESTINATION_ATA"
|
||||
```
|
||||
|
||||
6. Capturer la fixture :
|
||||
|
||||
```bash
|
||||
{ printf 'mint=%s\n' "$KB_DEVNET_CLASSIC_MINT"; printf 'source=%s\n' "$KB_DEVNET_CLASSIC_SOURCE_ATA"; printf 'destination=%s\n' "$KB_DEVNET_CLASSIC_DESTINATION_ATA"; printf 'authority=%s\n' "$KB_DEVNET_WALLET_PUBKEY"; printf 'amount_raw=1000000000\n'; printf 'decimals=9\n'; } | tee "$KB_DEVNET_VALIDATION_DIR/40-spl-token-fixture.txt"
|
||||
```
|
||||
|
||||
La création du compte destination par CLI est acceptable ici : `S03A` et `S03B` ont déjà validé l’executor ATA. `S04` doit isoler et valider l’executor SPL Token `TransferChecked`.
|
||||
|
||||
### C11 — Créer ou réutiliser la fixture Token-2022
|
||||
|
||||
Le workspace fournit une commande idempotente qui prépare les comptes publics requis par les huit scénarios Token-2022 :
|
||||
|
||||
```bash
|
||||
cargo run -p kb-pipeline-demo-scenarios --bin kb-pipeline-demo-scenarios-cli -- prepare-token-2022-fixture --rpc-url "$KB_DEVNET_RPC_URL" --wallet "$KB_DEVNET_WALLET" --wallet-dir "$PWD/wallets/temporary/local_devnet" --decimals 9 | tee "$KB_DEVNET_VALIDATION_DIR/50-spl-token-2022-fixture-preparation.json"
|
||||
```
|
||||
|
||||
Lorsque `--rpc-url` et `--wallet` sont omis, la commande utilise respectivement `KB_DEVNET_RPC_URL` et `KB_DEVNET_WALLET`. Lorsque `--wallet-dir` est omis, elle utilise le répertoire parent du wallet.
|
||||
|
||||
La commande :
|
||||
|
||||
- crée silencieusement les keypairs manquants avec des permissions `0600` ;
|
||||
- crée ou réutilise un mint Token-2022 avec mint authority et freeze authority égales au wallet opérateur ;
|
||||
- crée ou réutilise trois comptes Token-2022 distincts : source, destination et compte vide réservé à `CloseAccount` ;
|
||||
- crée ou réutilise une pubkey delegate indépendante ;
|
||||
- n'affiche jamais les phrases de récupération ni les octets privés ;
|
||||
- écrit atomiquement la fixture publique attendue par l'application.
|
||||
|
||||
Les keypairs et la fixture sont conservés sous :
|
||||
|
||||
```text
|
||||
wallets/temporary/local_devnet/spl_token_2022_validation/
|
||||
```
|
||||
|
||||
La fixture publique est :
|
||||
|
||||
```text
|
||||
wallets/temporary/local_devnet/spl_token_2022_validation/fixture.env
|
||||
```
|
||||
|
||||
Elle définit :
|
||||
|
||||
```text
|
||||
TOKEN_2022_PROGRAM
|
||||
TOKEN_2022_MINT
|
||||
TOKEN_2022_SOURCE
|
||||
TOKEN_2022_DESTINATION
|
||||
TOKEN_2022_CLOSE_ACCOUNT
|
||||
TOKEN_2022_DELEGATE
|
||||
TOKEN_2022_AUTHORITY
|
||||
TOKEN_2022_FREEZE_AUTHORITY
|
||||
TOKEN_2022_DECIMALS
|
||||
TOKEN_2022_MINT_AMOUNT_RAW
|
||||
TOKEN_2022_TRANSFER_AMOUNT_RAW
|
||||
TOKEN_2022_APPROVE_AMOUNT_RAW
|
||||
TOKEN_2022_BURN_AMOUNT_RAW
|
||||
KB_DEVNET_WALLET_ADDRESS
|
||||
```
|
||||
|
||||
Vérifier puis charger uniquement les valeurs publiques dans le terminal B :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_TOKEN_2022_FIXTURE="$PWD/wallets/temporary/local_devnet/spl_token_2022_validation/fixture.env" && test -f "$KB_DEVNET_TOKEN_2022_FIXTURE" && sed -n '/^export [A-Z0-9_]*=/p' "$KB_DEVNET_TOKEN_2022_FIXTURE" | sed 's/=.*$/=<défini>/' | tee "$KB_DEVNET_VALIDATION_DIR/50-spl-token-2022-fixture-keys.txt" && source "$KB_DEVNET_TOKEN_2022_FIXTURE"
|
||||
```
|
||||
|
||||
Afficher le mint et les trois comptes Token-2022 avec le Program ID explicite :
|
||||
|
||||
```bash
|
||||
spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$TOKEN_2022_PROGRAM" display "$TOKEN_2022_MINT" && spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$TOKEN_2022_PROGRAM" display "$TOKEN_2022_SOURCE" && spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$TOKEN_2022_PROGRAM" display "$TOKEN_2022_DESTINATION" && spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$TOKEN_2022_PROGRAM" display "$TOKEN_2022_CLOSE_ACCOUNT"
|
||||
```
|
||||
|
||||
Le compte `TOKEN_2022_CLOSE_ACCOUNT` doit rester vide jusqu'au scénario `CloseAccount`. Ne pas utiliser `account-info <adresse>` dans cette campagne : avec `spl-token-cli 5.5.0`, cette forme peut interpréter l'adresse comme un mint.
|
||||
|
||||
### C12 — Preuves applicatives communes
|
||||
|
||||
|
||||
|
||||
Pour chaque scénario, conserver depuis l’application :
|
||||
|
||||
- profil et cluster résolus ;
|
||||
- paramètres saisis ;
|
||||
- plan exact ;
|
||||
- signers requis ;
|
||||
- estimation des frais ;
|
||||
- résultat de simulation ;
|
||||
- `operation_code`, `program_id` et plan préparé ;
|
||||
- signers requis et fee payer ;
|
||||
- plafond de frais et plafond de dépense ;
|
||||
- résultat et logs de simulation ;
|
||||
- signature d’envoi ;
|
||||
- confirmation ;
|
||||
- résumé d’extraction/replay ;
|
||||
- résultat de confirmation ;
|
||||
- insertion canonique ;
|
||||
- extraction Core ;
|
||||
- Decode replay ciblé ;
|
||||
- projections matérialisées ;
|
||||
- diagnostics et écarts observés.
|
||||
- second replay démontrant l’idempotence ;
|
||||
- diagnostics ou écarts observés.
|
||||
|
||||
## 8. Critères de validation
|
||||
Un scénario n’est validé que si le replay ne produit ni échec fonctionnel ni erreur de traitement et si les projections attendues sont présentes et idempotentes.
|
||||
|
||||
Un scénario n’est validé que si :
|
||||
## 5. Préparation initiale de la campagne
|
||||
|
||||
- la simulation réussit ;
|
||||
- l’envoi est explicitement confirmé ;
|
||||
- la confirmation réseau correspond à la signature ;
|
||||
- le replay post-exécution ne produit ni échec fonctionnel ni erreur de traitement ;
|
||||
- les projections attendues sont présentes et idempotentes ;
|
||||
- le guide est corrigé lorsque le comportement réel diffère des étapes écrites.
|
||||
1. Dans le terminal B, exécuter `C01`, `C02`, `C03` et `C04`.
|
||||
2. Dans le terminal B, exécuter `C05` pour repartir d’une base propre.
|
||||
3. Dans le terminal A, exécuter `T01`.
|
||||
4. Attendre la création des 13 tables et la disponibilité de la fenêtre.
|
||||
5. Dans la fenêtre Configuration, vérifier que `local_devnet` utilise la base Devnet.
|
||||
6. Dans le terminal B, exécuter le contrôle de tables de `C05`.
|
||||
7. Financer la pubkey par un faucet Web Devnet si le solde est insuffisant.
|
||||
8. Réexécuter `C04` dans le terminal B après financement.
|
||||
9. Avant chaque scénario, définir `KB_DEVNET_SCENARIO` dans le terminal B, puis exécuter `C06`.
|
||||
|
||||
## 6. Scénario S01 — Solana Core System Transfer
|
||||
|
||||
### Objectif
|
||||
|
||||
Valider la chaîne complète : préparation, simulation, envoi, confirmation, stockage canonique, extraction Core et replay.
|
||||
|
||||
### Procédure
|
||||
|
||||
1. Définir puis exécuter `C06` :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="10-system-transfer"
|
||||
```
|
||||
|
||||
2. Dans la fenêtre **Exécution Devnet — Solana Core** :
|
||||
- générer un nouveau destinataire ;
|
||||
- conserver sa pubkey ;
|
||||
- saisir un montant borné ;
|
||||
- vérifier `solana.core.system.transfer` ;
|
||||
- simuler ;
|
||||
- contrôler frais, spend et signer ;
|
||||
- confirmer explicitement l’envoi.
|
||||
3. Définir la signature et exécuter `C07`.
|
||||
4. Capturer séparément le solde du destinataire :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_RECIPIENT="COLLER_LE_DESTINATAIRE"
|
||||
|
||||
solana balance \
|
||||
"$KB_DEVNET_RECIPIENT" \
|
||||
--url "$KB_DEVNET_RPC_URL" \
|
||||
--commitment confirmed \
|
||||
| tee "$KB_DEVNET_VALIDATION_DIR/${KB_DEVNET_SCENARIO}-recipient-after.txt"
|
||||
```
|
||||
|
||||
5. Exécuter les contrôles applicatifs `C08` sur la signature.
|
||||
|
||||
### Contrat d’erreur de l’interface
|
||||
|
||||
Pour un nouveau destinataire inexistant, le montant doit être au moins égal au minimum de rent exemption indiqué par l’application. Avec la valeur observée de `890880` lamports, une demande de `10000` lamports doit être refusée avant simulation.
|
||||
|
||||
Ce refus est attendu fonctionnellement, mais l’interface doit afficher l’erreur dans les panneaux de résultat :
|
||||
|
||||
- `Résumé` doit passer de `idle` à `error` ;
|
||||
- `Plan exact` doit afficher l’échec de préparation ou rester explicitement indisponible avec sa cause ;
|
||||
- `Simulation exacte` doit indiquer qu’aucune simulation n’a été lancée à cause du préflight ;
|
||||
- `Confirmation et replay` doit rester non exécuté, avec une raison explicite.
|
||||
|
||||
Un message uniquement présent dans le journal est insuffisant. Tant que les panneaux restent à `idle`, ne pas considérer le scénario comme validé et ne pas utiliser « Signer et envoyer ».
|
||||
|
||||
### Résultat historique de référence
|
||||
|
||||
La première campagne a validé la signature `3k8BaQJKwSn8r2pYdvfp1Q3VYrPEcDEuUunMFn7NDq1ZqsvryjoGsxeBBNJjc1123RgDCoykp7w9VrtZgsDw4ph3`, au slot `479589279`, avec `890880` lamports transférés, `5000` lamports de frais et `150` compute units. Cette preuve réseau reste historique ; les lignes PostgreSQL doivent être recréées dans la nouvelle base.
|
||||
|
||||
## 7. Scénario S02 — SPL Memo v4
|
||||
|
||||
### Objectif
|
||||
|
||||
Valider l’opération exécutable `spl.memo.add_memo`, l’événement observé `spl.memo.v4.add_memo` et la projection d’annotation.
|
||||
|
||||
### Procédure
|
||||
|
||||
1. Définir puis exécuter `C06` :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="20-spl-memo-v4"
|
||||
```
|
||||
|
||||
2. Dans la fenêtre **Exécution Devnet — SPL** :
|
||||
- sélectionner Memo v4 ;
|
||||
- saisir un texte UTF-8 borné ;
|
||||
- vérifier le Program ID `Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH` ;
|
||||
- vérifier le wallet signer ;
|
||||
- simuler puis confirmer l’envoi.
|
||||
3. Définir `KB_DEVNET_SIGNATURE` et exécuter `C07`.
|
||||
4. Exécuter `C08` et vérifier précisément :
|
||||
- `processor_name = materializer.transaction.annotations` ;
|
||||
- `surface_code = spl.memo.v4` ;
|
||||
- `event_code = spl.memo.v4.add_memo` ;
|
||||
- une seule annotation matérialisée ;
|
||||
- second replay ignoré/idempotent.
|
||||
|
||||
### Résultat historique de référence
|
||||
|
||||
La première campagne a validé la signature `3uYNASrHibwpnsFWwV2JHAxtnci96RhFYf6zbUSfGMbQQV37gfHizstk7atiHYYQCBm4jhmC6cT3G3CCPCV38Lpx`, au slot `479596483`, avec `5000` lamports de frais et `513` compute units. Après recréation de la base, cette signature peut être réingérée pour tester le replay, mais la campagne propre doit également produire une nouvelle preuve complète.
|
||||
|
||||
## 8. Scénario S03 — SPL Associated Token Account
|
||||
|
||||
Le scénario ATA est divisé en deux validations indépendantes. Une ATA dépend du triplet exact :
|
||||
|
||||
```text
|
||||
owner + token_program + mint
|
||||
```
|
||||
|
||||
Un même owner et deux mints appartenant à des Token Programs différents doivent donc produire deux dérivations et deux comptes distincts.
|
||||
|
||||
### S03A — ATA avec SPL Token classique
|
||||
|
||||
#### Objectif
|
||||
|
||||
Valider la dérivation et la création idempotente d’une ATA dont le mint appartient au programme SPL Token classique.
|
||||
|
||||
#### Préparation dans le terminal B
|
||||
|
||||
1. Exécuter `C08`.
|
||||
2. Définir le scénario et capturer le solde :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="30a-spl-ata-classic"
|
||||
```
|
||||
|
||||
3. Exécuter `C06`.
|
||||
4. Copier la valeur affichée par :
|
||||
|
||||
```bash
|
||||
printf '%s\n' "$KB_DEVNET_CLASSIC_MINT"
|
||||
```
|
||||
|
||||
#### Procédure dans l’application
|
||||
|
||||
1. Ouvrir la fenêtre **SPL Associated Token Account**.
|
||||
2. Utiliser :
|
||||
- owner : wallet opérateur `KB_DEVNET_WALLET_PUBKEY` ;
|
||||
- mint : `KB_DEVNET_CLASSIC_MINT` ;
|
||||
- token program : SPL Token classique ;
|
||||
- payer : wallet opérateur.
|
||||
3. Dériver l’ATA et conserver son adresse.
|
||||
4. Vérifier que le Program ID sélectionné est `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`.
|
||||
5. Simuler `spl.associated_token_account.create_idempotent`.
|
||||
6. Contrôler le rent ceiling, le payer, l’owner, le mint, le token program et l’adresse ATA dérivée.
|
||||
7. Confirmer explicitement l’envoi.
|
||||
8. Définir `KB_DEVNET_SIGNATURE`, puis exécuter `C07`.
|
||||
9. Exécuter `C12`.
|
||||
10. Réexécuter la création idempotente et vérifier qu’elle ne produit ni fausse création ni duplication des projections.
|
||||
|
||||
### S03B — ATA avec Token-2022
|
||||
|
||||
#### Objectif
|
||||
|
||||
Valider la dérivation et la création idempotente d’une ATA dont le mint appartient au programme Token-2022, puis démontrer qu’elle est distincte de l’ATA classique.
|
||||
|
||||
#### Préparation dans le terminal B
|
||||
|
||||
1. Exécuter `C09`.
|
||||
2. Définir le scénario et capturer le solde :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="30b-spl-ata-token-2022"
|
||||
```
|
||||
|
||||
3. Exécuter `C06`.
|
||||
4. Copier la valeur affichée par :
|
||||
|
||||
```bash
|
||||
printf '%s\n' "$KB_DEVNET_TOKEN_2022_MINT"
|
||||
```
|
||||
|
||||
#### Procédure dans l’application
|
||||
|
||||
1. Utiliser :
|
||||
- owner : le même wallet opérateur ;
|
||||
- mint : `KB_DEVNET_TOKEN_2022_MINT` ;
|
||||
- token program : Token-2022 ;
|
||||
- payer : wallet opérateur.
|
||||
2. Dériver l’ATA et conserver son adresse.
|
||||
3. Vérifier que le Program ID sélectionné est `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`.
|
||||
4. Vérifier que l’adresse dérivée diffère de l’ATA classique de S03A.
|
||||
5. Simuler puis envoyer `spl.associated_token_account.create_idempotent`.
|
||||
6. Définir `KB_DEVNET_SIGNATURE`, puis exécuter `C07`.
|
||||
7. Exécuter `C12`.
|
||||
8. Rejouer la création idempotente.
|
||||
9. Vérifier séparément les faits parent ATA et les éventuels enfants CPI Token-2022, sans duplication.
|
||||
|
||||
### Critères communs S03A/S03B
|
||||
|
||||
- le mint existe et son owner on-chain correspond au Token Program choisi ;
|
||||
- l’adresse ATA est dérivée avec les graines dans l’ordre canonique `owner`, `token_program`, `mint` ;
|
||||
- le compte créé a pour owner le Token Program attendu ;
|
||||
- le premier envoi peut créer le compte ;
|
||||
- le second envoi idempotent ne crée pas un second compte ;
|
||||
- le replay et les projections restent idempotents ;
|
||||
- aucune ATA classique n’est confondue avec une ATA Token-2022.
|
||||
|
||||
## 9. Scénario S04 — SPL Token classique
|
||||
|
||||
### Portée réellement exposée
|
||||
|
||||
La fenêtre actuelle expose uniquement :
|
||||
|
||||
```text
|
||||
spl.token.transfer_checked
|
||||
```
|
||||
|
||||
Elle ne permet pas encore d’enchaîner depuis l’interface `InitializeMint`, `MintToChecked`, `Approve`, `Revoke`, `BurnChecked` et `CloseAccount`. Ces opérations restent hors de ce scénario Devnet tant qu’elles ne sont pas exposées par la fenêtre.
|
||||
|
||||
### Préparation dans le terminal B
|
||||
|
||||
1. Réutiliser le mint classique de `C08` :
|
||||
|
||||
```bash
|
||||
export KB_SPL_TOKEN_PROGRAM_ID="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" && export KB_DEVNET_CLASSIC_MINT_KEYPAIR="$PWD/wallets/temporary/local_devnet/mints/ata-classic-mint.json" && export KB_DEVNET_CLASSIC_MINT="$(solana-keygen pubkey "$KB_DEVNET_CLASSIC_MINT_KEYPAIR")"
|
||||
```
|
||||
|
||||
2. Définir le scénario :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="40-spl-token"
|
||||
```
|
||||
|
||||
3. Exécuter `C06`.
|
||||
4. Exécuter `C10`.
|
||||
5. Vérifier les comptes token avant l’opération :
|
||||
|
||||
```bash
|
||||
spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" display "$KB_DEVNET_CLASSIC_SOURCE_ATA" && spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" display "$KB_DEVNET_CLASSIC_DESTINATION_ATA"
|
||||
```
|
||||
|
||||
### Valeurs à saisir dans l’application
|
||||
|
||||
Dans **Décodeur spl_token — TransferChecked** :
|
||||
|
||||
| Champ | Valeur |
|
||||
|--------------------|--------------------------------------------|
|
||||
| Compte source | `$KB_DEVNET_CLASSIC_SOURCE_ATA` |
|
||||
| Mint | `$KB_DEVNET_CLASSIC_MINT` |
|
||||
| Compte destination | `$KB_DEVNET_CLASSIC_DESTINATION_ATA` |
|
||||
| Autorité simple | `$KB_DEVNET_WALLET_PUBKEY` |
|
||||
| Montant brut exact | `1000000000` pour 1 token avec 9 décimales |
|
||||
| Decimals | `9` |
|
||||
|
||||
Afficher les valeurs à copier :
|
||||
|
||||
```bash
|
||||
printf 'source=%s\nmint=%s\ndestination=%s\nauthority=%s\namount_raw=1000000000\ndecimals=9\n' "$KB_DEVNET_CLASSIC_SOURCE_ATA" "$KB_DEVNET_CLASSIC_MINT" "$KB_DEVNET_CLASSIC_DESTINATION_ATA" "$KB_DEVNET_WALLET_PUBKEY"
|
||||
```
|
||||
|
||||
### Exécution
|
||||
|
||||
1. Cliquer **Préflight et simuler**.
|
||||
2. Vérifier :
|
||||
- owner des deux comptes = SPL Token classique ;
|
||||
- mint identique sur les deux comptes ;
|
||||
- decimals = `9` ;
|
||||
- source suffisamment financée ;
|
||||
- autorité simple = wallet opérateur ;
|
||||
- montant brut conservé exactement.
|
||||
3. Cocher la confirmation opérateur.
|
||||
4. Cliquer **Signer et envoyer Token**.
|
||||
5. Copier la signature dans :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SIGNATURE="SIGNATURE_SPL_TOKEN"
|
||||
```
|
||||
|
||||
6. Exécuter `C07`, puis `C12`.
|
||||
7. Vérifier les comptes après transfert :
|
||||
|
||||
```bash
|
||||
spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" display "$KB_DEVNET_CLASSIC_SOURCE_ATA" && spl-token --url "$KB_DEVNET_RPC_URL" --program-id "$KB_SPL_TOKEN_PROGRAM_ID" display "$KB_DEVNET_CLASSIC_DESTINATION_ATA"
|
||||
```
|
||||
|
||||
### Critères de validation
|
||||
|
||||
- simulation réussie ;
|
||||
- transaction confirmée puis finalisée ;
|
||||
- `operation_code = spl.token.transfer_checked` ;
|
||||
- montant brut exact ;
|
||||
- insertion canonique, extraction Core et replay réussis ;
|
||||
- projection métier présente ;
|
||||
- second replay idempotent ;
|
||||
- aucun compte Token-2022 impliqué.
|
||||
|
||||
Le journal métier SPL Token peut rester à `empty` après une simulation seule. Il doit être actualisé après l’envoi confirmé, le replay et la matérialisation.
|
||||
|
||||
## 10. Scénario S05 — Token-2022
|
||||
|
||||
### Préparation
|
||||
|
||||
1. Définir le scénario et exécuter `C06` :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="50-spl-token-2022"
|
||||
```
|
||||
|
||||
2. Exécuter `C11` pour créer ou réutiliser la fixture.
|
||||
3. Contrôler le mint, la source, la destination et le compte réservé à la fermeture avec les commandes `display` de `C11`.
|
||||
4. Dans l’application, ouvrir **Exécution spl_token_2022 — scénarios publics**.
|
||||
5. Cliquer **Charger la fixture Token-2022**.
|
||||
6. Vérifier que le message indique le chemin de `fixture.env` et le Program ID Token-2022.
|
||||
|
||||
Le bouton lit le `fixture.env` produit par `kb-pipeline-demo-scenarios` et remplit automatiquement :
|
||||
|
||||
- compte source ou cible ;
|
||||
- mint ;
|
||||
- compte destination ou destination lamports ;
|
||||
- delegate ;
|
||||
- autorité ;
|
||||
- freeze authority ;
|
||||
- montant brut ;
|
||||
- décimales.
|
||||
|
||||
Ne remplacer manuellement une valeur que pour un test négatif délibéré.
|
||||
|
||||
### Ordre des sous-scénarios
|
||||
|
||||
Exécuter les scénarios dans cet ordre, car certains modifient l’état nécessaire aux suivants :
|
||||
|
||||
#### S05.1 — MintToChecked
|
||||
|
||||
Champs utilisés :
|
||||
|
||||
- source/cible : compte token à créditer ;
|
||||
- mint : mint Token-2022 ;
|
||||
- autorité : mint authority ;
|
||||
- montant brut : `TOKEN_2022_MINT_AMOUNT_RAW` chargé depuis la fixture ;
|
||||
- décimales : valeur de la fixture.
|
||||
|
||||
Avec la fixture par défaut, le mint initial est `10000000000` unités brutes, soit 10 tokens avec 9 décimales. Cette quantité couvre ensuite le transfert, l'approbation et le burn prévus.
|
||||
|
||||
Simuler, envoyer, exécuter `C07`, puis `C12`.
|
||||
|
||||
#### S05.2 — TransferChecked
|
||||
|
||||
Champs utilisés :
|
||||
|
||||
- source : compte financé par S05.1 ;
|
||||
- mint ;
|
||||
- destination : second compte Token-2022 ;
|
||||
- autorité : owner du compte source ;
|
||||
- montant brut et décimales.
|
||||
|
||||
Simuler, envoyer, confirmer et vérifier les balances source/destination.
|
||||
|
||||
#### S05.3 — ApproveChecked
|
||||
|
||||
Champs utilisés :
|
||||
|
||||
- source ;
|
||||
- mint ;
|
||||
- delegate ;
|
||||
- autorité : owner du compte source ;
|
||||
- montant brut ;
|
||||
- décimales.
|
||||
|
||||
Après confirmation, vérifier la projection de délégation.
|
||||
|
||||
#### S05.4 — Revoke
|
||||
|
||||
Champs utilisés :
|
||||
|
||||
- source ;
|
||||
- autorité : owner du compte source.
|
||||
|
||||
Le mint et le delegate ne sont pas requis par le formulaire pour cette opération. Vérifier que la délégation précédente est supprimée.
|
||||
|
||||
#### S05.5 — BurnChecked
|
||||
|
||||
Champs utilisés :
|
||||
|
||||
- source ;
|
||||
- mint ;
|
||||
- autorité : owner du compte source ;
|
||||
- montant brut ;
|
||||
- décimales.
|
||||
|
||||
Le compte source doit conserver un solde suffisant après le transfert.
|
||||
|
||||
#### S05.6 — FreezeAccount
|
||||
|
||||
Champs utilisés :
|
||||
|
||||
- source/cible ;
|
||||
- mint ;
|
||||
- freeze authority.
|
||||
|
||||
Vérifier que la fixture désigne une freeze authority réellement configurée sur le mint.
|
||||
|
||||
#### S05.7 — ThawAccount
|
||||
|
||||
Réutiliser le même compte cible et la même freeze authority. Ce scénario doit suivre FreezeAccount.
|
||||
|
||||
#### S05.8 — CloseAccount
|
||||
|
||||
À exécuter uniquement avec le compte de fermeture prévu par la fixture :
|
||||
|
||||
- source/cible : `closeAccount` chargé par l’application ;
|
||||
- destination : autorité/destination lamports chargée ;
|
||||
- autorité : owner ou close authority.
|
||||
|
||||
Le compte doit être vide et satisfaire toutes les préconditions de fermeture.
|
||||
|
||||
### Pour chaque sous-scénario
|
||||
|
||||
1. sélectionner le scénario ;
|
||||
2. laisser `applyToken2022Fixture` remplir les champs adaptés ;
|
||||
3. cliquer **Préflight et simuler** ;
|
||||
4. contrôler le plan, les owners, les autorités, le montant et les extensions ;
|
||||
5. cocher la confirmation opérateur ;
|
||||
6. envoyer ;
|
||||
7. définir immédiatement `KB_DEVNET_SIGNATURE` avec la signature affichée pour cette sous-opération ;
|
||||
8. vérifier qu'elle diffère de la signature du scénario précédent, puis exécuter `C07` ;
|
||||
9. appliquer `C12` ;
|
||||
10. conserver un fichier de preuve distinct en modifiant temporairement le préfixe, par exemple :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="50a-token-2022-mint-to-checked"
|
||||
```
|
||||
|
||||
puis `50b`, `50c`, etc., avant chaque appel à `C07`.
|
||||
|
||||
### Critères de validation
|
||||
|
||||
- chaque opération disponible est simulée sur son message exact ;
|
||||
- les comptes sont owned par Token-2022 ;
|
||||
- les autorités correspondent à la fixture ;
|
||||
- les montants bruts et décimales sont exacts ;
|
||||
- les projections token account, admin, fee, metadata ou risk attendues sont présentes selon l’opération ;
|
||||
- aucun événement n’est attribué au programme Token classique ;
|
||||
- chaque replay est sans échec ;
|
||||
- le second replay est idempotent.
|
||||
|
||||
## 11. Scénario S06 — Registre ElGamal
|
||||
|
||||
### Objectif
|
||||
|
||||
Valider le programme indépendant de registre ElGamal sans le confondre avec Token-2022.
|
||||
|
||||
### Procédure
|
||||
|
||||
1. Définir puis exécuter `C06` :
|
||||
|
||||
```bash
|
||||
export KB_DEVNET_SCENARIO="60-spl-elgamal-registry"
|
||||
```
|
||||
|
||||
2. Vérifier le Program ID, le PDA de registre, l’owner, la longueur exacte du compte et les preuves requises.
|
||||
3. Simuler create/update selon le scénario disponible.
|
||||
4. Confirmer l’envoi, exécuter `C07`, puis appliquer `C08`.
|
||||
5. Vérifier la projection admin du registre et l’absence de fausse projection Token-2022.
|
||||
|
||||
## 12. Future fenêtre Metadata
|
||||
|
||||
La future fenêtre metadata devra suivre la même structure : commandes communes `C01` à `C12`, puis scénarios séparés pour les metadata incorporées Token-2022, Metaplex Token Metadata et l’enrichissement off-chain indépendant.
|
||||
|
||||
## 13. Critères de clôture de la campagne
|
||||
|
||||
La campagne est clôturable uniquement lorsque :
|
||||
|
||||
- tous les scénarios disponibles ont été rejoués depuis une base Devnet propre ;
|
||||
- toutes les signatures sont confirmées sur Devnet ;
|
||||
- les identités persistées respectent la nomenclature canonique ;
|
||||
- aucun ancien `processor_name`, `surface_code`, `operation_code` ou `event_code` ne subsiste ;
|
||||
- le replay ciblé est sans échec ni erreur de traitement ;
|
||||
- les projections sont présentes et idempotentes ;
|
||||
- le présent guide reflète les commandes réellement exécutées.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/IDEA_REMINDERS.md -->
|
||||
<!-- version: 2 -->
|
||||
<!-- version: 3 -->
|
||||
|
||||
# Rappels d’idées
|
||||
|
||||
@@ -11,6 +11,8 @@ Ce document regroupe les améliorations utiles mais non bloquantes pour la clôt
|
||||
- Ajouter une autocomplétion Pool lorsque des tables de référence fiables existeront.
|
||||
- Introduire une pagination SQL/IPC côté serveur avant l’exploitation de volumes massifs.
|
||||
- Étudier une résolution configurable du chemin de base utilisé par `kb-store`.
|
||||
- Séparer à terme la configuration du logging dans un fichier JSON dédié avec son propre schéma et ses propres profils de logging.
|
||||
- Permettre de sélectionner et changer un profil de logging indépendamment du profil applicatif actif, afin que les fenêtres Devnet puissent écrire dans des routes ou fichiers distincts sans changer le profil général de l’application.
|
||||
|
||||
## Pipeline et PostgreSQL
|
||||
|
||||
|
||||
105
docs/IDL_AUDIT.md
Normal file
105
docs/IDL_AUDIT.md
Normal file
@@ -0,0 +1,105 @@
|
||||
<!-- file: docs/IDL_AUDIT.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Audit des IDL v3
|
||||
|
||||
- Fichiers JSON : **91**
|
||||
- JSON invalides : **0**
|
||||
- Contenu JSON modifié : **non**
|
||||
- Collision de noms v3 : **0**
|
||||
|
||||
## Inventaire
|
||||
|
||||
| Nom v3 | Program ID déclaré | Version déclarée | Instructions | SHA-256 |
|
||||
|-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------|-----------------:|-------------:|--------------------------------------------------------------------|
|
||||
| `adapter.DecZY86MU5Gj7kppfUCEmd4LbXXuyZH1yHaP2NTqdiZB.saber_decimal_wrapper.V0_0_0.from_solscan.json` | `non déclaré` | `0.0.0` | 3 | `1b357156864a702c5a1019fd1d19bd5b60661f33101d46a77899b88c8fbc87da` |
|
||||
| `adapter.TwRapQCDhWkZRrDaHfZGuHxkZ91gHDRkyuzNqeU5MgR.spl_token_wrap.V0_1_0.from_github_solana_program.json` | `TwRapQCDhWkZRrDaHfZGuHxkZ91gHDRkyuzNqeU5MgR` | `0.1.0` | 6 | `8b0a4f56ea3bfa66ba2a1de8523a693629fb3a24417e28f338985eeddbf95cfc` |
|
||||
| `amm.2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c.lifinity_swap_v2.V0_1_1.from_solscan.json` | `non déclaré` | `0.1.1` | 3 | `bbfefa42ca3ffa024acca68cc0e14c7c4babbc2928923d02d615620b18624910` |
|
||||
| `amm.AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ.metadao_v0_5.V0_5_0.from_solscan.json` | `non déclaré` | `0.5.0` | 5 | `34c20e1ef623e96cd677f30548cadad2c49fc2b33217911c09b743d278bbae26` |
|
||||
| `amm.BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p.bonk_swap.V0_1_1.from_solscan.json` | `non déclaré` | `0.1.1` | 19 | `27eca49509a866341def453cf303aa8e524a7f8f42a9ab76900c63bbb215c001` |
|
||||
| `amm.Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB.meteora_damm_v1.V0_5_2.from_solscan.json` | `non déclaré` | `0.5.2` | 26 | `0dd02f981806be81c15353b009a4f077d8f59f7e0192af6bc89d56acaed36f6e` |
|
||||
| `amm.GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT.goosefx_gamma.V0_2_0.from_solscan.json` | `GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT` | `0.2.0` | 27 | `f515cfbeffebb5019ca15e25c2055fe1ea72882abc0b4a0dfbd6634eb1fa558b` |
|
||||
| `amm.GFXsSL5sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn.goosefx_v2.V0_3_0.from_solscan.json` | `non déclaré` | `0.3.0` | 8 | `ddfe3e78103781cb6189d928a8ad1c00325d668a01a7ef20fe32307424ad203d` |
|
||||
| `amm.Gswppe6ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1.guac_swap.V0_1_1.from_solscan.json` | `non déclaré` | `0.1.1` | 20 | `11dcb508fc32854aed599f860636e8b3e9de50abb9fdfc3126bc032ec6cae98a` |
|
||||
| `amm.WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb.woofi.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 41 | `864c5bd4331b8190e2e8cb8f9d01ba7bdbb42ba1e470cc6fbf95d3f9fb4c25b6` |
|
||||
| `amm.cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG.meteora_damm_v2.V0_2_0.from_solscan.json` | `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` | `0.2.0` | 38 | `86077cdb029944c16e6e7515fb3c3a3fba4f7821003a6d23507784e7d66d4ff9` |
|
||||
| `amm.pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA.pump_swap.V0_1_0.from_solscan.json` | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | `0.1.0` | 27 | `7e56e6acb0bd34530386abe3e91e89ecab66f9c2cbb1e959c4c941e09c0b0316` |
|
||||
| `amm.vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ.vertigo.V0_1_0.from_solscan.json` | `vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ` | `0.1.0` | 6 | `08f8a5aeba3197dca7f5702d6c0c91f0da9d96d1cd80815d2104b484e49d6103` |
|
||||
| `bridge.6doghB248px58JSSwG4qejQ46kFMW4AMj7vzJnWZHNZn.layer_zero_executor.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 8 | `6b2f1390e8647ea2a2b206c262e7ca226c11c014a49c6a948e208ef0a113f2cc` |
|
||||
| `bridge.76y77prsiCMvXMjuoZ5VRrhG5qYBrUMYTE5WgHqgjEn6.layer_zero_endpoint.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 32 | `5a1210a5325cc52196f33122485e6c10b4d1d19c919e9da85440aad97ca147dd` |
|
||||
| `bridge.CCTPV2vPZJS2u2BBsUoscuikbYjnpFmbFsvVuJdgUMQe.circle_cctp_token_messenger_minter_v2.V0_2_0.from_solscan.json` | `CCTPV2vPZJS2u2BBsUoscuikbYjnpFmbFsvVuJdgUMQe` | `0.2.0` | 25 | `7d12fedcd1a923ac1b4ce8dee1ca241ffc37c7c8f7682974bd14ebb75dd36520` |
|
||||
| `bridge.CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3.circle_cctp_token_messenger_minter.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 19 | `0a5b235212bf5c1791cb62d3775feeddfe8a6c81120455d60fb0d834afcd3f75` |
|
||||
| `clmm.6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6.stabble.V0_1_0.from_solscan.json` | `6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6` | `0.1.0` | 21 | `d0abb8e6b7f5b0e7ff0e73df2e94185d1d42b8e7e967f0341d2325ee99eccf37` |
|
||||
| `clmm.CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK.raydium.V0_1_0.from_solscan.json` | `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK` | `0.1.0` | 34 | `6cda2dfa4a880fea3ac91f5055dc1d9b64b799bde997a7941a181f70d6e226fc` |
|
||||
| `clmm.HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq.pancake_swap.V0_1_0.from_solscan.json` | `HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq` | `0.1.0` | 27 | `271fe54bb767dd63bb2194b6f40164026476cb871b8e624b8ab10d65d7ccf846` |
|
||||
| `clmm.REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2.byreal.V0_1_0.from_solscan.json` | `REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2` | `0.1.0` | 35 | `2192c87aaf13cf2838dc939bca965e1f9cd8bc2e1c0bc15c54804072390f1d3a` |
|
||||
| `clmm.fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9.fusion.V1_1_4.from_solscan.json` | `fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9` | `1.1.4` | 33 | `dfc258caa3c4060b761759d1d3120cfd87ac1c2a47c3f061d97ceb4eed97d0a5` |
|
||||
| `clmm.whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc.orca_whirlpool.V0_9_0.from_solscan.json` | `whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc` | `0.9.0` | 66 | `b858ae977743365529c970ced550eba435fa282a198c7d1a620865bd6e424460` |
|
||||
| `cpmm.CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C.raydium.V0_2_0.from_solscan.json` | `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` | `0.2.0` | 14 | `e4cbb793a8724e37cba2c92b38d074a9ddec9b810757b5fb404da523cfb4b59f` |
|
||||
| `dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.meteora.V0_12_0.from_solscan.json` | `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` | `0.12.0` | 76 | `24b04bbd70964c7a128b7c8df46be6000b43d7814e1ec54140728b7aedb60970` |
|
||||
| `fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.pump_fees.V0_1_0.from_solscan.json` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | `0.1.0` | 29 | `2f8c355c5af9d95891f64fd71986f01f8a630e62dec032d0de42bb23dfa3518e` |
|
||||
| `governance.FUTARELBfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq.metadao_futarchy.V0_6_1.from_solscan.json` | `non déclaré` | `0.6.1` | 23 | `1a35740c627990de699ea526ed83becf4331b40dbeea96687fa584f4a468ac81` |
|
||||
| `governance.SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf.squads_multisig.V2_0_0.from_solscan.json` | `non déclaré` | `2.0.0` | 31 | `5304fa2bac2d6ed5a749267ad0cfce217e9ecbf369805ececa0a83c12c51ac56` |
|
||||
| `governance.WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx.metadao_bid_wall.V0_7_0.from_solscan.json` | `non déclaré` | `0.7.0` | 5 | `6e48c20a4e6ffc1b3226ea2d31e846a4a1d2851d593dad3d8531e5de63b65fa2` |
|
||||
| `launchpad.5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki.virtuals.V0_1_0.from_solscan.json` | `5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki` | `0.1.0` | 8 | `a61fe5f6fd5add913dfde81e6c30c4a6051a226a741dc2cf7d625298da8260fa` |
|
||||
| `launchpad.6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.pump_fun.V0_1_0.from_solscan.json` | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | `0.1.0` | 40 | `5c3c6b548cb3845717eaa483e828aa8e938fc46a847b06f58dbb8e692015bed4` |
|
||||
| `launchpad.LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj.raydium_launchlab.V0_2_0.from_solscan.json` | `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj` | `0.2.0` | 25 | `f0f1c0c1fa9fb5cb19ba451c2148defc0e13dc33cf2a12b86790ac919ddeb1c1` |
|
||||
| `launchpad.MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG.moonit.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 6 | `ca1463bb404aa960a02a744a7b80e88a9706b7ad12fa018de14c445d5e8ec2c6` |
|
||||
| `launchpad.PdMDrKEMaX8q7CCJb7NvUCxerBCcsFUa4LjBEynTtEd.pump_pumpup_ai.V0_1_0.from_solscan.json` | `PdMDrKEMaX8q7CCJb7NvUCxerBCcsFUa4LjBEynTtEd` | `0.1.0` | 20 | `841e845ea956220d2f2bf6546efacad218b6d59097709e8a0de205b4cb9e32db` |
|
||||
| `launchpad.T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint.printr.V1_0_0.from_solscan.json` | `T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint` | `1.0.0` | 28 | `6124c944d3c45529fa3cdff6a69e842ed062892e7f7b53ccb25c13fad4957b5c` |
|
||||
| `launchpad.boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4.boop_fun.V0_3_0.from_solscan.json` | `boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4` | `0.3.0` | 29 | `f68e54671b2e80344804d499e5b8c4bd87e1a3f8705e85b69cdaf3540bcb41c5` |
|
||||
| `launchpad.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.meteora_dbc.V0_1_10.from_solscan.json` | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | `0.1.10` | 28 | `3499aacfe5647ea5a43951094e702826c46163b8e4678d5e75976955846a94d3` |
|
||||
| `launchpad.moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM.metadao_ico.V0_7_0.from_solscan.json` | `non déclaré` | `0.7.0` | 13 | `852eb123ab405ce54fa67f1237cfe4da9d66033457ad0f129a287989c675cc43` |
|
||||
| `launchpad.waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF.orca_wavebreak.V1_1_5.from_solscan.json` | `waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF` | `1.1.5` | 64 | `f38f1c00c81bcd94649fa2af5a7fc413149550718402fe1c4e0a6b2a43412d81` |
|
||||
| `lending.C1onEW2kPetmHmwe74YC1ESx3LnFEpVau6g2pg4fHycr.clone.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 30 | `670402c21d1cdc952aabc1e6b607be2769ab34024e2fc5a46699aefdb8c4814d` |
|
||||
| `lending.KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD.kamino.V1_23_0.from_solscan.json` | `non déclaré` | `1.23.0` | 63 | `de08e6fc025c3eb62b1445b225aae9e84a08f425cdd164bf7440e6ef7a04d87a` |
|
||||
| `lending.MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA.marginfi_v2.V0_1_8.from_solscan.json` | `MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA` | `0.1.8` | 91 | `950f5008a596147a52ce6c4403a675aaf357333b6a1920dafd23005770faa01f` |
|
||||
| `lock.LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE.raydium_lp.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 4 | `0422cb7577ce3cbd03c730141bb4172a80c71e89cb0622424cb8662645702d0a` |
|
||||
| `metadata.ProgM6JCCvbYkfKqJYHePx4xxSUSqJp7rh8Lyv7nk7S.solana_program_metadata.V0_0_0.from_github_solana_program.json` | `ProgM6JCCvbYkfKqJYHePx4xxSUSqJp7rh8Lyv7nk7S` | `0.0.0` | 9 | `e6874f519d2ecaa8d92e2d58d1caabc130352c98b5a829375efd31636dbbc7a1` |
|
||||
| `metadata.metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s.metaplex_token_metadata.V1_14_0.from_solscan.json` | `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s` | `1.14.0` | 58 | `8dcfda9d55aca11cc2e521c4670470533426da4613f208fcc2d0ea6bf3014f33` |
|
||||
| `nft.BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY.metaplex_bubblegum.V0_12_0.from_solscan.json` | `non déclaré` | `0.12.0` | 17 | `db126f7491582f905f79cf0d291233b3b651ed7ea8d96089c25ec8fc6c6c2a98` |
|
||||
| `nft.TCMPhJdwDryooaGtiocG1u3xcYbRpiJzb283XfCZsDp.tensor_cnft.V2_0_1.from_solscan.json` | `non déclaré` | `2.0.1` | 21 | `4033ac96e4a6af76178e997e58bb670a515c7f397b02dd1e647392c7e3851786` |
|
||||
| `orderbook.j1o2qRpjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X.jupiter_limit_order_v2.V0_1_0.from_solscan.json` | `j1o2qRpjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X` | `0.1.0` | 8 | `f6d9c4ef2bc8a8d7757f09743c571526d23137414056d72d8724f0aa6392e1fe` |
|
||||
| `orderbook.jupoNjAxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzYNrNu.jupiter_limit_order.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 9 | `06a4d4d60cb5baefd2404fccad2818a4ac201dd0132b3ac530060d2c7ed67ffd` |
|
||||
| `orderbook.opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb.openbook_v2.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 29 | `e5bc0fcaf3a4b53f22e77704105664f872b338561acabe0f2248b0f84327d391` |
|
||||
| `perpetuals.EtrnLzgbS7nMMy5fbD42kXiUzGg8XQzJ972Xtk1cjWih.phoenix_eternal.V0_2_0.from_solscan.json` | `EtrnLzgbS7nMMy5fbD42kXiUzGg8XQzJ972Xtk1cjWih` | `0.2.0` | 80 | `fed07943bba51add829c11e69e32c2302a41f242567174f999f6a60cf770e87b` |
|
||||
| `perpetuals.PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu.jupiter.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 59 | `9b9276a918f27028093742277d9b4335be66ff8a73b566d03a61cf1373c36d98` |
|
||||
| `perpetuals.ZETAxsqBRek56DhiGXrn75yj2NHU3aYUnxvHXpkf3aD.zeta.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 107 | `24194a0de79d5eef4da3d425f0555c81b3f7e983d0ed6d98a99e93bd8cae1927` |
|
||||
| `perpetuals.dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH.drift_v2.V2_150_0.from_solscan.json` | `non déclaré` | `2.150.0` | 241 | `198ab073625c9f5c8c18596d00344d8f194070aebf94f813e41ca51f1a4d1b6b` |
|
||||
| `router.6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma.okx_labs_v1.V0_1_0.from_solscan.json` | `6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma` | `0.1.0` | 14 | `018edd87dcbc99da4ff852223c649075dfc0bfaef6115ef343d5b543920c8e5a` |
|
||||
| `router.DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH.dflow_aggregator_v4.V0_1_0.from_solscan.json` | `DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH` | `0.1.0` | 17 | `a61d05f857becf70f6ff348fcdbd025996d9e9120809d6fb91d7e150d38d5947` |
|
||||
| `router.JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB.jupiter_aggregator_v4.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 34 | `3b69fd55ba15e8620b7c24209650b5ca84eb435f5cbdd596cb59023826bf1bb9` |
|
||||
| `router.JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4.jupiter_aggregator_v6.V0_1_0.from_solscan.json` | `JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4` | `0.1.0` | 17 | `98f4bf0ea4388f8cc341fc49678756289c5381339a678003f1494960e7ac6f46` |
|
||||
| `router.proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u.okx_labs_v2.V0_1_0.from_solscan.json` | `proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u` | `0.1.0` | 19 | `39c8f7d80af6534178cc688d0ab580d19d059154ff5142e764a39dd65d61bd34` |
|
||||
| `rwa.XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm.ondo_global_markets.V0_1_0.from_solscan.json` | `XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm` | `0.1.0` | 62 | `33ce1bcfd180cb9b202d7706e7d797bd96d87ea6a8fe7853f2e197fc880ae2b5` |
|
||||
| `solana.11111111111111111111111111111111.core.system.V0_0_1.from_github_solana_program.json` | `11111111111111111111111111111111` | `0.0.1` | 14 | `e48967dbcbd252ef175a91f6684630e1f4c5c3e6176bc2c2c4f21d16193f86df` |
|
||||
| `solana.AddressLookupTab1e1111111111111111111111111.core.address_lookup_table.V0_0_1.from_github_solana_program.json` | `AddressLookupTab1e1111111111111111111111111` | `0.0.1` | 5 | `91ae5d89d647a3dec7dcf36fa4dd96064b902d50bd5f65b2ce41f4aef5a53cfc` |
|
||||
| `solana.BPFLoaderUpgradeab1e11111111111111111111111.core.loader_v3.V0_0_0.from_github_solana_program.json` | `CoreBPFLoaderUpgradeab1e1111111111111111111` | `0.0.0` | 8 | `a30e6f9f497e6339b63b06a4253c3c7fe1871672009e15994b51c4016376a997` |
|
||||
| `solana.ComputeBudget111111111111111111111111111111.core.compute_budget.V0_0_1.from_github_solana_program.json` | `ComputeBudget111111111111111111111111111111` | `0.0.1` | 5 | `7b430c17afdae7c804ad9cd8b3d7f934a8dcf8fddaf4802731e8e7b1eed1b6a1` |
|
||||
| `solana.Config1111111111111111111111111111111111111.core.config.V0_0_1.from_github_solana_program.json` | `Config1111111111111111111111111111111111111` | `0.0.1` | 1 | `c6faf7d86e83e305749b8231211d9a713398775ec7eae97032ece88c50e76aa4` |
|
||||
| `solana.Feature111111111111111111111111111111111111.core.feature.V0_0_1.from_github_solana_program.json` | `Feature111111111111111111111111111111111111` | `0.0.1` | 1 | `a442ae23b4083aa9111f9dbddb8e25907c9411413d775b671f93c02a183c4784` |
|
||||
| `solana.LoaderV411111111111111111111111111111111111.core.loader_v4.V0_0_0.from_github_solana_program.json` | `CoreBPFLoaderV41111111111111111111111111111` | `0.0.0` | 6 | `641c77405ce3967c375df5e3d886dbf84e52a2cd8c7626e537a6e5a4ff93c076` |
|
||||
| `solana.Stake11111111111111111111111111111111111111.core.stake.V4_3_1.from_github_solana_program.json` | `Stake11111111111111111111111111111111111111` | `4.3.1` | 18 | `f9e914666fac43a6c6c3eeab141b950efc9c5702c814fe5b55875a323d904230` |
|
||||
| `spl.MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr.memo.v3.V3_0_1.from_github_solana_program.json` | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | `3.0.1` | 1 | `95c763b4fc93d339ab3567c811b064459241f19345e7963a037530d6af94865a` |
|
||||
| `spl.TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA.token.V3_3_0.from_github_solana_program.json` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | `3.3.0` | 28 | `de47e7a9469b962dbf7c9f643aa3433316936fbfc0c48aad261ab6388af9611d` |
|
||||
| `spl.TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb.token_2022.V3_0_1.from_github_solana_program.json` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `3.0.1` | 100 | `3c65163c8ed2934a353bc0fc42ddd3193b93137407ca2d3e71a3c3d9692841e4` |
|
||||
| `stable.HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn.swap_hylo_exchange.V0_1_4.from_solscan.json` | `HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn` | `0.1.4` | 27 | `6230bd19f9ac55e3bcc3e0dbd1967d9272732f8e6f1233dfee859d4a7828b53c` |
|
||||
| `stable.JUPUSDecMzAVgztLe6eGhwUBj1Pn3j9WAXwmtHmfbRr.swap_jupiter_stable.V0_1_0.from_solscan.json` | `JUPUSDecMzAVgztLe6eGhwUBj1Pn3j9WAXwmtHmfbRr` | `0.1.0` | 13 | `5365cc15dd0476ac697ec435899f9f14c23c499bbda2a56fe1910c086f5386d7` |
|
||||
| `stable.NUMERUNsFCP3kuNmWZuXtm1AaQCPj9uw6Guv2Ekoi5P.swap_numeraire.V0_1_0.from_solscan.json` | `NUMERUNsFCP3kuNmWZuXtm1AaQCPj9uw6Guv2Ekoi5P` | `0.1.0` | 22 | `50e3a8ea08c61312fcdb371ef5916e94bd9ccf6101b395fc80019d725e892da1` |
|
||||
| `stable.swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ.swap_stabble.V1_5_0.from_solscan.json` | `swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ` | `1.5.0` | 19 | `c82c0aa3f83db311e605f716ec7f1fdf2aadea7b611455489fad7b668a2fb77b` |
|
||||
| `staking.4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7.jito_tip_distribution.V0_1_5.from_solscan.json` | `4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7` | `0.1.5` | 10 | `d8ba465c8b5bfbcb62763107e514c0672b89ee0d3f66d773719925372ec9ef99` |
|
||||
| `staking.FarmsPZpWu9i7Kky8tPN37rs2TpmMrAZrC7S7vJa91Hr.kamino_farm.V1_6_5.from_solscan.json` | `non déclaré` | `1.6.5` | 26 | `e7b825abd1e44bdc8dd315d491de7f3ddc67e58fce4222f5379a61f31b372572` |
|
||||
| `staking.MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD.marinade_finance.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 28 | `f549293a7aeaf2f31f584a869a1e6e0e280f496efa0b4e3c70998e6551c1a987` |
|
||||
| `storage.recr1L3PCGKLbckBqMNcJhuuyU1zgo8nBhfLVsJNwr5.solana_record.V0_4_0.from_github_solana_program.json` | `recr1L3PCGKLbckBqMNcJhuuyU1zgo8nBhfLVsJNwr5` | `0.4.0` | 5 | `9c6a4c8849cf1778cc633bb07ffb8933e0945beba5c072e303894691c761caba` |
|
||||
| `strategy.DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M.jupiter_dca.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 12 | `0e3cfa37ab4ec041d9e806abb6dcf9e225b3b0a404515cb0ae5b0e1ae76b46c5` |
|
||||
| `treasury.treaf4wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5.helium_treasury_management.V0_2_3.from_solscan.json` | `treaf4wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5` | `0.2.3` | 3 | `36e6ce8da7ea0cea0a8a7be0a8e35b679cbcae2e859e98b5b527775ea973d673` |
|
||||
| `vault.24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi.meteora.V0_7_2.from_solscan.json` | `non déclaré` | `0.7.2` | 14 | `21f750d8ffbb17be4d73bfb4d24cc142897d53a350700f678b927af924305929` |
|
||||
| `vault.6LtLpnUFNByNXLyCoK9wA2MykKAmQNZKBdY8s47dehDc.kamino_yvaults.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 38 | `2a76880dfba5b8fa102823ba9b72ae62095ea78270b9eaa1b0d6c44b176f801f` |
|
||||
| `vault.CarrotwivhMpDnm27EHmRLeQ683Z1PufuqEmBZvD282s.carrot_defi.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 42 | `21932378870ab46deb3408ec5cabfa19d8b47949ba04a57442692ab8abc53cf1` |
|
||||
| `vault.HysTabVUfmQBFcmzu1ctRd1Y1fxd66RBpboy1bmtDSQQ.hylo_stability_pool.V0_1_4.from_solscan.json` | `HysTabVUfmQBFcmzu1ctRd1Y1fxd66RBpboy1bmtDSQQ` | `0.1.4` | 9 | `70c87ac19ac1d3b8b0ed31d4d4e52d74ab2b155ac1a2b8057ba859c0f42ba106` |
|
||||
| `vault.KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd.kamino_v2.V2_1_1.from_solscan.json` | `non déclaré` | `2.1.1` | 22 | `17a310e293893bb8fe8cb7daee0b1ef59fd9f31da8ba1fd1f00e7a436ca4348a` |
|
||||
| `vault.kvauTFR8qm1dhniz6pYuBZkuene3Hfrs1VQhVRgCNrr.kamino.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 12 | `5a1c6a1e584be14f8eee1abf4682d057f9aba5d35c4597c48cb2fa997d41cddc` |
|
||||
| `vesting.LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn.jupiter_lock.V0_4_0.from_solscan.json` | `LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn` | `0.4.0` | 11 | `f424e9c0df4b6bd6e63d40f1ffcf6be065bdb734323808fa1f11c1cb60610bb8` |
|
||||
| `vesting.strmRqUCoQUgGUan5YhzUZa6KqdzwX5L6FpUxfmKg5m.streamflow.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 10 | `d74b7df8692ca019de952534f532d8b38b38ef8a34139bff894df1efd9aed0df` |
|
||||
| `wallet.JSW99DKmxNyREQM14SQLDykeBvEUG63TeohrvmofEiw.jupiter_apepro_smart_wallet.V0_1_0.from_solscan.json` | `non déclaré` | `0.1.0` | 6 | `7d47428b045fe7ace80dc0f4b5b8a1e8a509a1ed77cd60d90d39f8a1c9e232ec` |
|
||||
| `weighted.swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW.swap_stabble.V1_5_0.from_solscan.json` | `swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW` | `1.5.0` | 13 | `97ffbefbaa3a9729ac5cd700c2650a74042730ca1c6d0c9acf702504721fcb43` |
|
||||
101
docs/IDL_TO_KB_LIB_NOMENCLATURE.md
Normal file
101
docs/IDL_TO_KB_LIB_NOMENCLATURE.md
Normal file
@@ -0,0 +1,101 @@
|
||||
<!-- file: docs/IDL_TO_KB_LIB_NOMENCLATURE.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Correspondance IDL ↔ `kb-lib`
|
||||
|
||||
Ce tableau constitue la cible de classification pour les futurs décodeurs et exécuteurs.
|
||||
Il ne signifie pas que tous les modules proposés sont déjà implémentés.
|
||||
|
||||
| IDL v3 | Module actuel | Module cible | Action Rust |
|
||||
|-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------|------------------------------------------------|---------------------------------------------------------------------|
|
||||
| `adapter.DecZY86MU5Gj7kppfUCEmd4LbXXuyZH1yHaP2NTqdiZB.saber_decimal_wrapper.V0_0_0.from_solscan.json` | `adapter/saber_decimal_wrapper` | `adapter/saber_decimal_wrapper` | Aucune |
|
||||
| `adapter.TwRapQCDhWkZRrDaHfZGuHxkZ91gHDRkyuzNqeU5MgR.spl_token_wrap.V0_1_0.from_github_solana_program.json` | `—` | `adapter/spl_token_wrap` | Créer `adapter/spl_token_wrap` |
|
||||
| `amm.2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c.lifinity_swap_v2.V0_1_1.from_solscan.json` | `amm/lifinity_swap_v2` | `amm/lifinity_swap_v2` | Aucune |
|
||||
| `amm.AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ.metadao_v0_5.V0_5_0.from_solscan.json` | `amm/metadao_v0_5` | `amm/metadao_v0_5` | Aucune |
|
||||
| `amm.BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p.bonk_swap.V0_1_1.from_solscan.json` | `amm/bonk_swap` | `amm/bonk_swap` | Aucune |
|
||||
| `amm.Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB.meteora_damm_v1.V0_5_2.from_solscan.json` | `amm/meteora_damm_v1` | `amm/meteora_damm_v1` | Aucune |
|
||||
| `amm.GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT.goosefx_gamma.V0_2_0.from_solscan.json` | `amm/goosefx_gamma` | `amm/goosefx_gamma` | Aucune |
|
||||
| `amm.GFXsSL5sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn.goosefx_v2.V0_3_0.from_solscan.json` | `amm/goosefx_v2` | `amm/goosefx_v2` | Aucune |
|
||||
| `amm.Gswppe6ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1.guac_swap.V0_1_1.from_solscan.json` | `amm/guac_swap` | `amm/guac_swap` | Aucune |
|
||||
| `amm.WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb.woofi.V0_1_0.from_solscan.json` | `amm/woofi` | `amm/woofi` | Aucune |
|
||||
| `amm.cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG.meteora_damm_v2.V0_2_0.from_solscan.json` | `amm/meteora_damm_v2` | `amm/meteora_damm_v2` | Aucune |
|
||||
| `amm.pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA.pump_swap.V0_1_0.from_solscan.json` | `amm/pump_swap` | `amm/pump_swap` | Aucune |
|
||||
| `amm.vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ.vertigo.V0_1_0.from_solscan.json` | `amm/vertigo` | `amm/vertigo` | Aucune |
|
||||
| `bridge.6doghB248px58JSSwG4qejQ46kFMW4AMj7vzJnWZHNZn.layer_zero_executor.V0_1_0.from_solscan.json` | `bridge/layer_zero_executor` | `bridge/layer_zero_executor` | Aucune |
|
||||
| `bridge.76y77prsiCMvXMjuoZ5VRrhG5qYBrUMYTE5WgHqgjEn6.layer_zero_endpoint.V0_1_0.from_solscan.json` | `bridge/layer_zero_endpoint` | `bridge/layer_zero_endpoint` | Aucune |
|
||||
| `bridge.CCTPV2vPZJS2u2BBsUoscuikbYjnpFmbFsvVuJdgUMQe.circle_cctp_token_messenger_minter_v2.V0_2_0.from_solscan.json` | `bridge/circle_cctp_token_messenger_minter_v2` | `bridge/circle_cctp_token_messenger_minter_v2` | Aucune |
|
||||
| `bridge.CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3.circle_cctp_token_messenger_minter.V0_1_0.from_solscan.json` | `bridge/circle_cctp_token_messenger_minter` | `bridge/circle_cctp_token_messenger_minter` | Aucune |
|
||||
| `clmm.6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6.stabble.V0_1_0.from_solscan.json` | `clmm/stabble` | `clmm/stabble` | Aucune |
|
||||
| `clmm.CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK.raydium.V0_1_0.from_solscan.json` | `clmm/raydium` | `clmm/raydium` | Aucune |
|
||||
| `clmm.HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq.pancake_swap.V0_1_0.from_solscan.json` | `clmm/pancake_swap` | `clmm/pancake_swap` | Aucune |
|
||||
| `clmm.REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2.byreal.V0_1_0.from_solscan.json` | `clmm/byreal` | `clmm/byreal` | Aucune |
|
||||
| `clmm.fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9.fusion.V1_1_4.from_solscan.json` | `clmm/fusion` | `clmm/fusion` | Aucune |
|
||||
| `clmm.whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc.orca_whirlpool.V0_9_0.from_solscan.json` | `clmm/orca_whirlpool` | `clmm/orca_whirlpool` | Aucune |
|
||||
| `cpmm.CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C.raydium.V0_2_0.from_solscan.json` | `cpmm/raydium` | `cpmm/raydium` | Aucune |
|
||||
| `dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.meteora.V0_12_0.from_solscan.json` | `dlmm/meteora` | `dlmm/meteora` | Aucune |
|
||||
| `fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.pump_fees.V0_1_0.from_solscan.json` | `admin/pump_fees` | `fees/pump_fees` | Déplacer `admin/pump_fees` → `fees/pump_fees` |
|
||||
| `governance.FUTARELBfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq.metadao_futarchy.V0_6_1.from_solscan.json` | `amm/metadao_futarchy_amm` | `governance/metadao_futarchy` | Déplacer `amm/metadao_futarchy_amm` → `governance/metadao_futarchy` |
|
||||
| `governance.SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf.squads_multisig.V2_0_0.from_solscan.json` | `—` | `governance/squads_multisig` | Créer `governance/squads_multisig` |
|
||||
| `governance.WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx.metadao_bid_wall.V0_7_0.from_solscan.json` | `governance/metadao_bid_wall` | `governance/metadao_bid_wall` | Aucune |
|
||||
| `launchpad.5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki.virtuals.V0_1_0.from_solscan.json` | `amm/virtuals` | `launchpad/virtuals` | Déplacer `amm/virtuals` → `launchpad/virtuals` |
|
||||
| `launchpad.6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.pump_fun.V0_1_0.from_solscan.json` | `launchpad/pump_fun` | `launchpad/pump_fun` | Aucune |
|
||||
| `launchpad.LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj.raydium_launchlab.V0_2_0.from_solscan.json` | `launchpad/raydium_launchlab` | `launchpad/raydium_launchlab` | Aucune |
|
||||
| `launchpad.MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG.moonit.V0_1_0.from_solscan.json` | `launchpad/moonit` | `launchpad/moonit` | Aucune |
|
||||
| `launchpad.PdMDrKEMaX8q7CCJb7NvUCxerBCcsFUa4LjBEynTtEd.pump_pumpup_ai.V0_1_0.from_solscan.json` | `launchpad/pump_pumpup_ai` | `launchpad/pump_pumpup_ai` | Aucune |
|
||||
| `launchpad.T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint.printr.V1_0_0.from_solscan.json` | `launchpad/printr` | `launchpad/printr` | Aucune |
|
||||
| `launchpad.boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4.boop_fun.V0_3_0.from_solscan.json` | `launchpad/boop_fun` | `launchpad/boop_fun` | Aucune |
|
||||
| `launchpad.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.meteora_dbc.V0_1_10.from_solscan.json` | `launchpad/meteora_dbc` | `launchpad/meteora_dbc` | Aucune |
|
||||
| `launchpad.moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM.metadao_ico.V0_7_0.from_solscan.json` | `launchpad/metadao_ico` | `launchpad/metadao_ico` | Aucune |
|
||||
| `launchpad.waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF.orca_wavebreak.V1_1_5.from_solscan.json` | `launchpad/orca_wavebreak` | `launchpad/orca_wavebreak` | Aucune |
|
||||
| `lending.C1onEW2kPetmHmwe74YC1ESx3LnFEpVau6g2pg4fHycr.clone.V0_1_0.from_solscan.json` | `lending/clone` | `lending/clone` | Aucune |
|
||||
| `lending.KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD.kamino.V1_23_0.from_solscan.json` | `lending/kamino` | `lending/kamino` | Aucune |
|
||||
| `lending.MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA.marginfi_v2.V0_1_8.from_solscan.json` | `lending/marginfi_v2` | `lending/marginfi_v2` | Aucune |
|
||||
| `lock.LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE.raydium_lp.V0_1_0.from_solscan.json` | `lock/raydium_lp` | `lock/raydium_lp` | Aucune |
|
||||
| `metadata.ProgM6JCCvbYkfKqJYHePx4xxSUSqJp7rh8Lyv7nk7S.solana_program_metadata.V0_0_0.from_github_solana_program.json` | `—` | `metadata/solana_program_metadata` | Créer `metadata/solana_program_metadata` |
|
||||
| `metadata.metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s.metaplex_token_metadata.V1_14_0.from_solscan.json` | `metadata/metaplex_token_metadata` | `metadata/metaplex_token_metadata` | Aucune |
|
||||
| `nft.BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY.metaplex_bubblegum.V0_12_0.from_solscan.json` | `nft/metaplex_bubblegum` | `nft/metaplex_bubblegum` | Aucune |
|
||||
| `nft.TCMPhJdwDryooaGtiocG1u3xcYbRpiJzb283XfCZsDp.tensor_cnft.V2_0_1.from_solscan.json` | `—` | `nft/tensor_cnft` | Créer `nft/tensor_cnft` |
|
||||
| `orderbook.j1o2qRpjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X.jupiter_limit_order_v2.V0_1_0.from_solscan.json` | `orderbook/jupiter_limit_order_v2` | `orderbook/jupiter_limit_order_v2` | Aucune |
|
||||
| `orderbook.jupoNjAxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzYNrNu.jupiter_limit_order.V0_1_0.from_solscan.json` | `orderbook/jupiter_limit_order` | `orderbook/jupiter_limit_order` | Aucune |
|
||||
| `orderbook.opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb.openbook_v2.V0_1_0.from_solscan.json` | `orderbook/openbook_v2` | `orderbook/openbook_v2` | Aucune |
|
||||
| `perpetuals.EtrnLzgbS7nMMy5fbD42kXiUzGg8XQzJ972Xtk1cjWih.phoenix_eternal.V0_2_0.from_solscan.json` | `—` | `perpetuals/phoenix_eternal` | Créer `perpetuals/phoenix_eternal` |
|
||||
| `perpetuals.PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu.jupiter.V0_1_0.from_solscan.json` | `perpetuals/jupiter` | `perpetuals/jupiter` | Aucune |
|
||||
| `perpetuals.ZETAxsqBRek56DhiGXrn75yj2NHU3aYUnxvHXpkf3aD.zeta.V0_1_0.from_solscan.json` | `perpetuals/zeta` | `perpetuals/zeta` | Aucune |
|
||||
| `perpetuals.dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH.drift_v2.V2_150_0.from_solscan.json` | `perpetuals/drift_v2` | `perpetuals/drift_v2` | Aucune |
|
||||
| `router.6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma.okx_labs_v1.V0_1_0.from_solscan.json` | `router/okx_labs_v1` | `router/okx_labs_v1` | Aucune |
|
||||
| `router.DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH.dflow_aggregator_v4.V0_1_0.from_solscan.json` | `router/dflow_aggregator_v4` | `router/dflow_aggregator_v4` | Aucune |
|
||||
| `router.JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB.jupiter_aggregator_v4.V0_1_0.from_solscan.json` | `router/jupiter_aggregator_v4` | `router/jupiter_aggregator_v4` | Aucune |
|
||||
| `router.JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4.jupiter_aggregator_v6.V0_1_0.from_solscan.json` | `router/jupiter_aggregator_v6` | `router/jupiter_aggregator_v6` | Aucune |
|
||||
| `router.proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u.okx_labs_v2.V0_1_0.from_solscan.json` | `router/okx_labs_v2` | `router/okx_labs_v2` | Aucune |
|
||||
| `rwa.XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm.ondo_global_markets.V0_1_0.from_solscan.json` | `rwa/ondo_global_markets` | `rwa/ondo_global_markets` | Aucune |
|
||||
| `solana.11111111111111111111111111111111.core.system.V0_0_1.from_github_solana_program.json` | `solana/core/system` | `solana/core/system` | Aucune |
|
||||
| `solana.AddressLookupTab1e1111111111111111111111111.core.address_lookup_table.V0_0_1.from_github_solana_program.json` | `solana/core/address_lookup_table` | `solana/core/address_lookup_table` | Aucune |
|
||||
| `solana.BPFLoaderUpgradeab1e11111111111111111111111.core.loader_v3.V0_0_0.from_github_solana_program.json` | `solana/core/loader_v3` | `solana/core/loader_v3` | Aucune |
|
||||
| `solana.ComputeBudget111111111111111111111111111111.core.compute_budget.V0_0_1.from_github_solana_program.json` | `solana/core/compute_budget` | `solana/core/compute_budget` | Aucune |
|
||||
| `solana.Config1111111111111111111111111111111111111.core.config.V0_0_1.from_github_solana_program.json` | `solana/core/config` | `solana/core/config` | Aucune |
|
||||
| `solana.Feature111111111111111111111111111111111111.core.feature.V0_0_1.from_github_solana_program.json` | `solana/core/feature` | `solana/core/feature` | Aucune |
|
||||
| `solana.LoaderV411111111111111111111111111111111111.core.loader_v4.V0_0_0.from_github_solana_program.json` | `solana/core/loader_v4` | `solana/core/loader_v4` | Aucune |
|
||||
| `solana.Stake11111111111111111111111111111111111111.core.stake.V4_3_1.from_github_solana_program.json` | `solana/core/stake` | `solana/core/stake` | Aucune |
|
||||
| `spl.MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr.memo.v3.V3_0_1.from_github_solana_program.json` | `spl/memo/v3` | `spl/memo/v3` | Aucune |
|
||||
| `spl.TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA.token.V3_3_0.from_github_solana_program.json` | `spl/token` | `spl/token` | Aucune |
|
||||
| `spl.TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb.token_2022.V3_0_1.from_github_solana_program.json` | `spl/token_2022` | `spl/token_2022` | Aucune |
|
||||
| `stable.HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn.swap_hylo_exchange.V0_1_4.from_solscan.json` | `stable/swap_hylo_exchange` | `stable/swap_hylo_exchange` | Aucune |
|
||||
| `stable.JUPUSDecMzAVgztLe6eGhwUBj1Pn3j9WAXwmtHmfbRr.swap_jupiter_stable.V0_1_0.from_solscan.json` | `stable/swap_jupiter_stable` | `stable/swap_jupiter_stable` | Aucune |
|
||||
| `stable.NUMERUNsFCP3kuNmWZuXtm1AaQCPj9uw6Guv2Ekoi5P.swap_numeraire.V0_1_0.from_solscan.json` | `stable/swap_numeraire` | `stable/swap_numeraire` | Aucune |
|
||||
| `stable.swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ.swap_stabble.V1_5_0.from_solscan.json` | `stable/swap_stabble` | `stable/swap_stabble` | Aucune |
|
||||
| `staking.4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7.jito_tip_distribution.V0_1_5.from_solscan.json` | `—` | `staking/jito_tip_distribution` | Créer `staking/jito_tip_distribution` |
|
||||
| `staking.FarmsPZpWu9i7Kky8tPN37rs2TpmMrAZrC7S7vJa91Hr.kamino_farm.V1_6_5.from_solscan.json` | `staking/kamino_farm` | `staking/kamino_farm` | Aucune |
|
||||
| `staking.MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD.marinade_finance.V0_1_0.from_solscan.json` | `staking/marinade_finance` | `staking/marinade_finance` | Aucune |
|
||||
| `storage.recr1L3PCGKLbckBqMNcJhuuyU1zgo8nBhfLVsJNwr5.solana_record.V0_4_0.from_github_solana_program.json` | `—` | `storage/solana_record` | Créer `storage/solana_record` |
|
||||
| `strategy.DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M.jupiter_dca.V0_1_0.from_solscan.json` | `strategy/jupiter_dca` | `strategy/jupiter_dca` | Déplacer `strategy/jupiter_dca` → `strategy/jupiter_dca` |
|
||||
| `treasury.treaf4wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5.helium_treasury_management.V0_2_3.from_solscan.json` | `treasury/helium_treasury_management` | `treasury/helium_treasury_management` | Aucune |
|
||||
| `vault.24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi.meteora.V0_7_2.from_solscan.json` | `vault/meteora` | `vault/meteora` | Aucune |
|
||||
| `vault.6LtLpnUFNByNXLyCoK9wA2MykKAmQNZKBdY8s47dehDc.kamino_yvaults.V0_1_0.from_solscan.json` | `vault/kamino_yvaults` | `vault/kamino_yvaults` | Aucune |
|
||||
| `vault.CarrotwivhMpDnm27EHmRLeQ683Z1PufuqEmBZvD282s.carrot_defi.V0_1_0.from_solscan.json` | `vault/carrot_defi` | `vault/carrot_defi` | Aucune |
|
||||
| `vault.HysTabVUfmQBFcmzu1ctRd1Y1fxd66RBpboy1bmtDSQQ.hylo_stability_pool.V0_1_4.from_solscan.json` | `vault/hylo_stability_pool` | `vault/hylo_stability_pool` | Aucune |
|
||||
| `vault.KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd.kamino_v2.V2_1_1.from_solscan.json` | `vault/kamino_v2` | `vault/kamino_v2` | Aucune |
|
||||
| `vault.kvauTFR8qm1dhniz6pYuBZkuene3Hfrs1VQhVRgCNrr.kamino.V0_1_0.from_solscan.json` | `vault/kamino` | `vault/kamino` | Aucune |
|
||||
| `vesting.LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn.jupiter_lock.V0_4_0.from_solscan.json` | `admin/jupiter_lock` | `vesting/jupiter_lock` | Déplacer `admin/jupiter_lock` → `vesting/jupiter_lock` |
|
||||
| `vesting.strmRqUCoQUgGUan5YhzUZa6KqdzwX5L6FpUxfmKg5m.streamflow.V0_1_0.from_solscan.json` | `vesting/streamflow` | `vesting/streamflow` | Aucune |
|
||||
| `wallet.JSW99DKmxNyREQM14SQLDykeBvEUG63TeohrvmofEiw.jupiter_apepro_smart_wallet.V0_1_0.from_solscan.json` | `wallet/jupiter_apepro_smart_wallet` | `wallet/jupiter_apepro_smart_wallet` | Aucune |
|
||||
| `weighted.swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW.swap_stabble.V1_5_0.from_solscan.json` | `weighted/swap_stabble` | `weighted/swap_stabble` | Aucune |
|
||||
22
docs/MISSING_PROGRAM_IDLS.md
Normal file
22
docs/MISSING_PROGRAM_IDLS.md
Normal file
@@ -0,0 +1,22 @@
|
||||
<!-- file: docs/MISSING_PROGRAM_IDLS.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Programmes ou IDL manquants
|
||||
|
||||
Cette liste distingue l'absence d'un fichier dans `idls_v3` de l'absence d'une IDL officielle publiée.
|
||||
|
||||
## Surfaces Bot3 déjà implémentées sans IDL correspondante dans l'archive
|
||||
|
||||
| Classification `kb-lib` | Program ID | Situation |
|
||||
|--------------------------------|------------------------------------------------|-------------------------------------------------|
|
||||
| `spl/memo/v1` | `Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo` | aucune IDL correspondante dans `idls_v2` |
|
||||
| `spl/memo/v4` | `Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH` | aucune IDL correspondante dans `idls_v2` |
|
||||
| `spl/associated_token_account` | `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL` | aucune IDL officielle identifiée dans l'archive |
|
||||
| `spl/elgamal_registry` | `E1Gama1Registry11111111111111111111111111111` | aucune IDL séparée identifiée dans l'archive |
|
||||
|
||||
## Remarques
|
||||
|
||||
- Le fichier Memo présent correspond à `MemoSq4...`, donc à la génération v3 dans la nomenclature Bot3.
|
||||
- L'absence d'IDL ne signifie pas l'absence de source normative : les crates d'interface officielles,
|
||||
le code runtime et les matrices wire restent utilisables.
|
||||
- La liste devra être recalculée après chaque ajout de programme à `kb-program-ids`.
|
||||
268
docs/OPERATION_NAMING_CONVENTION.md
Normal file
268
docs/OPERATION_NAMING_CONVENTION.md
Normal file
@@ -0,0 +1,268 @@
|
||||
<!-- file: docs/OPERATION_NAMING_CONVENTION.md -->
|
||||
<!-- version: 2 -->
|
||||
|
||||
# Convention canonique des identités runtime et des codes d’opération
|
||||
|
||||
## 1. Objet
|
||||
|
||||
Ce document définit les chaînes stables utilisées par `khadhroony-bot3` dans le code, les plans d’exécution, les événements décodés, les sorties matérialisées, les journaux et PostgreSQL.
|
||||
|
||||
Ces chaînes sont des contrats de données. Elles ne doivent pas être renommées localement, improvisées dans un test ou dérivées du nom d’une ancienne crate. Toute nouvelle surface doit être ajoutée à la matrice `test-fixtures/contract-matrices/OPERATION_NAMING_MATRIX.json` avant son premier remplissage persistant.
|
||||
|
||||
## 2. Principe général
|
||||
|
||||
Les valeurs persistées utilisent une hiérarchie en segments séparés par un point :
|
||||
|
||||
```text
|
||||
<domain>.<family>[.<generation-or-subsystem>][.<operation>]
|
||||
```
|
||||
|
||||
Chaque segment utilise `snake_case`. Un underscore reste autorisé à l’intérieur d’un concept indivisible, par exemple `token_2022`, `compute_budget` ou `associated_token_account`. Il ne doit pas remplacer un séparateur hiérarchique.
|
||||
|
||||
Correct :
|
||||
|
||||
```text
|
||||
solana.core.system.transfer
|
||||
spl.memo.v4.add_memo
|
||||
spl.token_2022.transfer_checked
|
||||
spl.associated_token_account.create_idempotent
|
||||
metadata.metaplex_token_metadata.create_metadata_account_v3
|
||||
```
|
||||
|
||||
Interdit :
|
||||
|
||||
```text
|
||||
solana_core.system.transfer
|
||||
spl_memo_v4.add_memo
|
||||
spl_token_2022.transfer_checked
|
||||
spl_associated_token_account.create_idempotent
|
||||
metadata_metaplex_token_metadata.create_metadata_account_v3
|
||||
```
|
||||
|
||||
## 2.1 Frontière avec les codes de registre
|
||||
|
||||
La notation par points s’applique aux identités runtime, processeurs, surfaces, opérations et événements persistés. Elle ne s’applique pas aux codes techniques du registre `kb-program-ids`, qui restent des identifiants Rust/registre en `lower_snake_case` afin de préserver leur ordre lexical, leur compatibilité et leur rôle de clé interne.
|
||||
|
||||
Exemples de codes de registre :
|
||||
|
||||
```text
|
||||
metadata_metaplex_token_metadata
|
||||
spl_memo_v4
|
||||
spl_token
|
||||
spl_token_2022
|
||||
```
|
||||
|
||||
Le même programme peut donc avoir :
|
||||
|
||||
```text
|
||||
registry code : spl_token_2022
|
||||
processor_name : spl.token_2022
|
||||
surface_code : spl.token_2022
|
||||
```
|
||||
|
||||
## 3. Catégories de noms
|
||||
|
||||
### 3.1 Identité runtime d’un composant
|
||||
|
||||
Format :
|
||||
|
||||
```text
|
||||
kb-lib.<role>.<domain>.<family>[.<subsystem>]
|
||||
```
|
||||
|
||||
Exemples :
|
||||
|
||||
```text
|
||||
kb-lib.decoder.solana.core
|
||||
kb-lib.executor.solana.core
|
||||
kb-lib.decoder.spl.memo
|
||||
kb-lib.executor.spl.token_2022
|
||||
kb-lib.materializer.transaction.annotations
|
||||
```
|
||||
|
||||
Cette identité désigne le composant logiciel, pas une opération on-chain.
|
||||
|
||||
### 3.2 `processor_name`
|
||||
|
||||
Format :
|
||||
|
||||
```text
|
||||
<domain>.<family>[.<subsystem>]
|
||||
```
|
||||
|
||||
Exemples :
|
||||
|
||||
```text
|
||||
solana.core
|
||||
spl.memo
|
||||
spl.token
|
||||
spl.token_2022
|
||||
spl.associated_token_account
|
||||
spl.elgamal_registry
|
||||
metadata.metaplex_token_metadata
|
||||
materializer.transaction.annotations
|
||||
materializer.token.accounts
|
||||
materializer.risk
|
||||
```
|
||||
|
||||
`processor_name` doit rester stable entre les campagnes et ne doit pas inclure une version. La version est stockée séparément dans `processor_version`.
|
||||
|
||||
### 3.3 `surface_code`
|
||||
|
||||
Format :
|
||||
|
||||
```text
|
||||
<domain>.<family>[.<generation-or-subsystem>]
|
||||
```
|
||||
|
||||
La surface représente la frontière on-chain effectivement observée.
|
||||
|
||||
Exemples :
|
||||
|
||||
```text
|
||||
solana.core.system
|
||||
solana.core.compute_budget
|
||||
solana.core.loader_v4
|
||||
spl.memo.v1
|
||||
spl.memo.v3
|
||||
spl.memo.v4
|
||||
spl.token
|
||||
spl.token_2022
|
||||
spl.token_2022.confidential_transfer
|
||||
spl.associated_token_account
|
||||
metadata.metaplex_token_metadata
|
||||
```
|
||||
|
||||
Une génération est ajoutée seulement lorsqu’elle change l’identité du programme ou le contrat observé.
|
||||
|
||||
### 3.4 `operation_code`
|
||||
|
||||
Format :
|
||||
|
||||
```text
|
||||
<generic-executable-surface>.<operation>
|
||||
```
|
||||
|
||||
`operation_code` décrit une intention constructible par un exécuteur. Il peut être plus générique que l’événement observé lorsque l’exécuteur cible une seule génération actuelle.
|
||||
|
||||
Exemples :
|
||||
|
||||
```text
|
||||
solana.core.system.transfer
|
||||
spl.memo.add_memo
|
||||
spl.token.transfer_checked
|
||||
spl.token_2022.close_account
|
||||
spl.associated_token_account.create
|
||||
```
|
||||
|
||||
Pour Memo, l’exécuteur ne construit que Memo v4, mais l’intention reste `spl.memo.add_memo`. Le Program ID du plan fixe la génération réellement construite.
|
||||
|
||||
### 3.5 `event_code`
|
||||
|
||||
Format :
|
||||
|
||||
```text
|
||||
<observed-surface>.<event>
|
||||
```
|
||||
|
||||
`event_code` décrit ce qui a été observé et conserve la génération lorsque celle-ci est significative.
|
||||
|
||||
Exemples :
|
||||
|
||||
```text
|
||||
spl.memo.v1.add_memo
|
||||
spl.memo.v3.add_memo
|
||||
spl.memo.v4.add_memo
|
||||
spl.token.transfer_checked
|
||||
spl.token_2022.close_account
|
||||
solana.core.system.transfer
|
||||
```
|
||||
|
||||
### 3.6 `protocol_code`
|
||||
|
||||
`protocol_code` identifie le protocole fonctionnel sans opération :
|
||||
|
||||
```text
|
||||
solana.core
|
||||
spl.memo
|
||||
spl.token
|
||||
spl.token_2022
|
||||
spl.associated_token_account
|
||||
spl.elgamal_registry
|
||||
metadata.metaplex_token_metadata
|
||||
```
|
||||
|
||||
Il ne doit pas réintroduire les anciennes formes `solana_native`, `spl_token` ou `spl_memo`.
|
||||
|
||||
## 4. Correspondance entre Rust et les valeurs persistées
|
||||
|
||||
Les symboles Rust suivent les règles Rust habituelles, tandis que leurs valeurs suivent cette convention :
|
||||
|
||||
```rust
|
||||
pub const EX_SPL_TOKEN_2022_TRANSFER_CHECKED_OPERATION: &str =
|
||||
"spl.token_2022.transfer_checked";
|
||||
```
|
||||
|
||||
- symbole Rust : `SCREAMING_SNAKE_CASE` ;
|
||||
- module Rust : `snake_case` ;
|
||||
- valeur persistée : segments hiérarchiques séparés par `.` ;
|
||||
- type Rust : `PascalCase`, par exemple `Token2022`.
|
||||
|
||||
## 5. Stabilité et migrations
|
||||
|
||||
Ces valeurs peuvent participer à :
|
||||
|
||||
- des clés de ledger ;
|
||||
- des contraintes d’unicité ;
|
||||
- des clés d’idempotence ;
|
||||
- des événements Decode ;
|
||||
- des observations de couverture ;
|
||||
- des sorties matérialisées ;
|
||||
- des filtres SQL et frontend ;
|
||||
- des preuves de scénarios Devnet.
|
||||
|
||||
Un renommage après remplissage d’une base est donc une migration de données. Avant production, toute modification exige :
|
||||
|
||||
1. une mise à jour coordonnée du code, des matrices et des règles ;
|
||||
2. une décision explicite entre migration SQL et reconstruction des tables dérivées ;
|
||||
3. une validation de l’idempotence ;
|
||||
4. une vérification des filtres et APIs ;
|
||||
5. une nouvelle preuve runtime.
|
||||
|
||||
Pendant la phase actuelle de développement, les bases Devnet et recherche peuvent être recréées depuis les raws.
|
||||
|
||||
## 6. Matrice normative
|
||||
|
||||
La source machine-readable est :
|
||||
|
||||
```text
|
||||
test-fixtures/contract-matrices/OPERATION_NAMING_MATRIX.json
|
||||
```
|
||||
|
||||
Chaque entrée documente au minimum :
|
||||
|
||||
- `programId` ;
|
||||
- `processorName` ;
|
||||
- `surfaceCode` ;
|
||||
- `operationCode` ;
|
||||
- `eventCode` ;
|
||||
- `decoderName` ;
|
||||
- `executorName` ;
|
||||
- `status` ;
|
||||
- `source`.
|
||||
|
||||
Une surface `decode_only` peut avoir `operationCode` et `executorName` à `null`.
|
||||
|
||||
## 7. Règles d’ajout d’une nouvelle opération
|
||||
|
||||
Avant de fusionner une nouvelle opération :
|
||||
|
||||
1. choisir son domaine et sa famille ;
|
||||
2. identifier le Program ID canonique dans `kb-program-ids` ;
|
||||
3. définir `processor_name` et `surface_code` ;
|
||||
4. définir séparément `operation_code` et `event_code` ;
|
||||
5. ajouter les constantes Rust ;
|
||||
6. ajouter ou mettre à jour la matrice normative ;
|
||||
7. ajouter les tests de cohérence entre constantes et matrice ;
|
||||
8. vérifier l’impact PostgreSQL avant tout backfill ou replay durable.
|
||||
|
||||
@@ -1,62 +1,39 @@
|
||||
<!-- file: idls/001.README.md -->
|
||||
<!-- version: 2 -->
|
||||
|
||||
# IDL locales
|
||||
# Répertoire IDL v3
|
||||
|
||||
Ce répertoire contient les IDL téléchargées depuis des sources officielles ou de référence et utilisées pour auditer les décodeurs, matérialiseurs et exécuteurs.
|
||||
Ce répertoire contient 91 fichiers IDL JSON issus exclusivement de `idls_v2.zip`.
|
||||
Le contenu brut des JSON n'a pas été modifié ; seuls les noms de fichiers ont été normalisés.
|
||||
|
||||
## Règle d’admission
|
||||
|
||||
Une IDL devient une source locale active lorsqu’un décodeur ou un exécuteur correspondant est développé. À ce moment-là, il faut :
|
||||
|
||||
1. télécharger l’IDL utilisée ;
|
||||
2. vérifier son Program ID et sa provenance ;
|
||||
3. conserver son contenu JSON inchangé ;
|
||||
4. la renommer selon la convention canonique ;
|
||||
5. documenter sa version ou son commit lorsqu’ils sont connus ;
|
||||
6. ajouter des tests comparant, selon le périmètre disponible, l’IDL, le runtime, les builders et l’interface officielle.
|
||||
|
||||
Les fichiers JSON ne doivent pas recevoir de commentaires ni être reformattés uniquement pour satisfaire la documentation.
|
||||
|
||||
## Convention de nommage
|
||||
|
||||
Forme principale :
|
||||
## Convention
|
||||
|
||||
```text
|
||||
<PROGRAM_ID>.<protocol_type>.<protocol_code>.json
|
||||
<famille-kb-lib>.<program-id>.<chemin-module>[.<génération-ou-sous-système>].V<version-idl>.from_<source>.json
|
||||
```
|
||||
|
||||
Exemple actif :
|
||||
- `famille-kb-lib` correspond au premier niveau fonctionnel de `kb-lib` : `solana`, `spl`,
|
||||
`metadata`, `launchpad`, `fees`, `strategy`, etc.
|
||||
- `program-id` est l'identifiant canonique du programme.
|
||||
- `chemin-module` correspond au module fonctionnel cible sans les rôles `decoder` ou `executor`.
|
||||
- `v1`, `v3`, `v4` désignent une génération de programme ou de surface.
|
||||
- `V3_0_1` désigne la version déclarée par l'IDL.
|
||||
- `from_solscan` et `from_github_solana_program` indiquent la provenance.
|
||||
|
||||
```text
|
||||
metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s.metadata.metaplex_token_metadata.json
|
||||
```
|
||||
## Documents
|
||||
|
||||
Lorsqu’il faut conserver plusieurs versions réellement distinctes d’une même IDL :
|
||||
- `../docs/IDL_AUDIT.md` : inventaire, validation JSON, versions et empreintes.
|
||||
- `../docs/MISSING_PROGRAM_IDLS.md` : programmes connus sans IDL présente ou sans IDL officielle identifiée.
|
||||
- `../docs/IDL_TO_KB_LIB_NOMENCLATURE.md` : correspondance entre chaque IDL et le module `kb-lib`.
|
||||
|
||||
```text
|
||||
<PROGRAM_ID>.<protocol_type>.<protocol_code>.<version>.json
|
||||
```
|
||||
## Décisions architecturales intégrées
|
||||
|
||||
Suffixes admis, par ordre de préférence :
|
||||
- `admin/pump_fees` devient `fees/pump_fees`.
|
||||
- `admin/jupiter_lock` devient `vesting/jupiter_lock`.
|
||||
- `amm/metadao_futarchy_amm` devient `governance/metadao_futarchy`.
|
||||
- `amm/virtuals` devient `launchpad/virtuals`.
|
||||
- `router/jupiter_dca` devient `strategy/jupiter_dca`.
|
||||
- une famille `storage` est proposée pour `storage/solana_record`.
|
||||
|
||||
```text
|
||||
v<semver>
|
||||
commit-<short_hash>
|
||||
slot-<deployment_slot>
|
||||
date-YYYY-MM-DD
|
||||
```
|
||||
|
||||
La version ne doit jamais être inventée. Tant qu’une seule IDL est conservée pour un programme, le suffixe de version reste facultatif.
|
||||
|
||||
## Classification
|
||||
|
||||
- `protocol_type` représente la famille fonctionnelle stable, par exemple `metadata`, `launchpad`, `amm`, `clmm`, `lending`, `router`, `vault` ou `orderbook`.
|
||||
- `protocol_code` représente le protocole ou la surface exacte, par exemple `metaplex_token_metadata`.
|
||||
- La classification est validée lors de l’implémentation du décodeur ou de l’exécuteur ; les IDL de référence non encore utilisées ne doivent pas être renommées massivement sur une classification incertaine.
|
||||
|
||||
## Intégrité
|
||||
|
||||
Le renommage du fichier est autorisé. Le contenu de l’IDL doit rester identique à la source téléchargée.
|
||||
|
||||
Les graphies externes telles que `token2022`, les noms de types Anchor et les identifiants publiés dans l’IDL ne doivent pas être adaptés à la nomenclature interne du workspace.
|
||||
Ces changements de modules ne sont pas appliqués au code Rust dans cette archive ; ils servent de cible
|
||||
pour la prochaine refactorisation de `kb-lib`.
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
{"version":"0.0.0","name":"add_decimals","instructions":[{"name":"initializeWrapper","accounts":[{"name":"wrapper","isMut":true,"isSigner":false},{"name":"wrapperUnderlyingTokens","isMut":false,"isSigner":false},{"name":"underlyingMint","isMut":false,"isSigner":false},{"name":"wrapperMint","isMut":false,"isSigner":false},{"name":"payer","isMut":false,"isSigner":true},{"name":"rent","isMut":false,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false}],"args":[{"name":"nonce","type":"u8"}]},{"name":"deposit","accounts":[{"name":"wrapper","isMut":false,"isSigner":false},{"name":"wrapperMint","isMut":true,"isSigner":false},{"name":"wrapperUnderlyingTokens","isMut":true,"isSigner":false},{"name":"owner","isMut":false,"isSigner":true},{"name":"userUnderlyingTokens","isMut":true,"isSigner":false},{"name":"userWrappedTokens","isMut":true,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false}],"args":[{"name":"depositAmount","type":"u64"}]},{"name":"withdraw","accounts":[{"name":"wrapper","isMut":false,"isSigner":false},{"name":"wrapperMint","isMut":true,"isSigner":false},{"name":"wrapperUnderlyingTokens","isMut":true,"isSigner":false},{"name":"owner","isMut":false,"isSigner":true},{"name":"userUnderlyingTokens","isMut":true,"isSigner":false},{"name":"userWrappedTokens","isMut":true,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false}],"args":[{"name":"maxBurnAmount","type":"u64"}]}],"accounts":[{"name":"WrappedToken","type":{"kind":"struct","fields":[{"name":"decimals","type":"u8"},{"name":"multiplier","type":"u64"},{"name":"wrapperUnderlyingMint","type":"publicKey"},{"name":"wrapperUnderlyingTokens","type":"publicKey"},{"name":"wrapperMint","type":"publicKey"}]}}],"events":[{"name":"InitEvent","fields":[{"name":"payer","type":"publicKey","index":false},{"name":"decimals","type":"u8","index":false},{"name":"multiplier","type":"u64","index":false},{"name":"wrapperUnderlyingMint","type":"publicKey","index":false},{"name":"wrapperUnderlyingTokens","type":"publicKey","index":false},{"name":"wrapperMint","type":"publicKey","index":false}]},{"name":"DepositEvent","fields":[{"name":"owner","type":"publicKey","index":false},{"name":"underlyingMint","type":"publicKey","index":false},{"name":"wrappedMint","type":"publicKey","index":false},{"name":"depositAmount","type":"u64","index":false},{"name":"mintAmount","type":"u64","index":false}]},{"name":"WithdrawEvent","fields":[{"name":"owner","type":"publicKey","index":false},{"name":"underlyingMint","type":"publicKey","index":false},{"name":"wrappedMint","type":"publicKey","index":false},{"name":"withdrawAmount","type":"u64","index":false},{"name":"burnAmount","type":"u64","index":false},{"name":"dustAmount","type":"u64","index":false}]}],"errors":[{"code":300,"name":"InitNonEmptyAccount","msg":"Wrapper underlying tokens account must be empty."},{"code":301,"name":"InitWrapperSupplyNonZero","msg":"Supply of the wrapper mint is non-zero"},{"code":302,"name":"InitWrapperUnderlyingOwnerMismatch","msg":"Owner of the wrapper underlying tokens account must be the wrapper"},{"code":303,"name":"InitWrapperUnderlyingMintMismatch","msg":"Underlying mint does not match underlying tokens account mint"},{"code":304,"name":"InitMintAuthorityMismatch","msg":"Mint authority mismatch"},{"code":305,"name":"InitMultiplierOverflow","msg":"Initial decimals too high"},{"code":306,"name":"InitWrapperDecimalsTooLow","msg":"The number of target decimals must be greater than or equal to the underlying asset's decimals."},{"code":307,"name":"MintAmountOverflow","msg":"Mint amount overflow. This error happens when the token cannot support this many decimals added to the token."},{"code":308,"name":"InvalidBurnAmount","msg":"Failed to convert burn amount from withdraw amount."},{"code":309,"name":"InvalidWithdrawAmount","msg":"Failed to convert withdraw amount from wrapped amount."},{"code":310,"name":"InsufficientUnderlyingBalance","msg":"User does not have enough underlying tokens"},{"code":311,"name":"InsufficientWrappedBalance","msg":"User does not have enough wrapped tokens"},{"code":312,"name":"ZeroAmount","msg":"Cannot send zero tokens"},{"code":313,"name":"UnknownAction","msg":"Unknown router action"}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,348 @@
|
||||
{
|
||||
"version": "0.0.0",
|
||||
"name": "add_decimals",
|
||||
"instructions": [
|
||||
{
|
||||
"name": "initializeWrapper",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "wrapper",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperUnderlyingTokens",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "underlyingMint",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperMint",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "payer",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "rent",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "systemProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "nonce",
|
||||
"type": "u8"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "deposit",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "wrapper",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperUnderlyingTokens",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "owner",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "userUnderlyingTokens",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userWrappedTokens",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "depositAmount",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "withdraw",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "wrapper",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperUnderlyingTokens",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "owner",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "userUnderlyingTokens",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userWrappedTokens",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "maxBurnAmount",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"accounts": [
|
||||
{
|
||||
"name": "WrappedToken",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "decimals",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "multiplier",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "wrapperUnderlyingMint",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "wrapperUnderlyingTokens",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "wrapperMint",
|
||||
"type": "publicKey"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"events": [
|
||||
{
|
||||
"name": "InitEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "payer",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "decimals",
|
||||
"type": "u8",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "multiplier",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperUnderlyingMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperUnderlyingTokens",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "wrapperMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DepositEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "owner",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "underlyingMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "wrappedMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "depositAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "mintAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "WithdrawEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "owner",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "underlyingMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "wrappedMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "withdrawAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "burnAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "dustAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"errors": [
|
||||
{
|
||||
"code": 300,
|
||||
"name": "InitNonEmptyAccount",
|
||||
"msg": "Wrapper underlying tokens account must be empty."
|
||||
},
|
||||
{
|
||||
"code": 301,
|
||||
"name": "InitWrapperSupplyNonZero",
|
||||
"msg": "Supply of the wrapper mint is non-zero"
|
||||
},
|
||||
{
|
||||
"code": 302,
|
||||
"name": "InitWrapperUnderlyingOwnerMismatch",
|
||||
"msg": "Owner of the wrapper underlying tokens account must be the wrapper"
|
||||
},
|
||||
{
|
||||
"code": 303,
|
||||
"name": "InitWrapperUnderlyingMintMismatch",
|
||||
"msg": "Underlying mint does not match underlying tokens account mint"
|
||||
},
|
||||
{
|
||||
"code": 304,
|
||||
"name": "InitMintAuthorityMismatch",
|
||||
"msg": "Mint authority mismatch"
|
||||
},
|
||||
{
|
||||
"code": 305,
|
||||
"name": "InitMultiplierOverflow",
|
||||
"msg": "Initial decimals too high"
|
||||
},
|
||||
{
|
||||
"code": 306,
|
||||
"name": "InitWrapperDecimalsTooLow",
|
||||
"msg": "The number of target decimals must be greater than or equal to the underlying asset's decimals."
|
||||
},
|
||||
{
|
||||
"code": 307,
|
||||
"name": "MintAmountOverflow",
|
||||
"msg": "Mint amount overflow. This error happens when the token cannot support this many decimals added to the token."
|
||||
},
|
||||
{
|
||||
"code": 308,
|
||||
"name": "InvalidBurnAmount",
|
||||
"msg": "Failed to convert burn amount from withdraw amount."
|
||||
},
|
||||
{
|
||||
"code": 309,
|
||||
"name": "InvalidWithdrawAmount",
|
||||
"msg": "Failed to convert withdraw amount from wrapped amount."
|
||||
},
|
||||
{
|
||||
"code": 310,
|
||||
"name": "InsufficientUnderlyingBalance",
|
||||
"msg": "User does not have enough underlying tokens"
|
||||
},
|
||||
{
|
||||
"code": 311,
|
||||
"name": "InsufficientWrappedBalance",
|
||||
"msg": "User does not have enough wrapped tokens"
|
||||
},
|
||||
{
|
||||
"code": 312,
|
||||
"name": "ZeroAmount",
|
||||
"msg": "Cannot send zero tokens"
|
||||
},
|
||||
{
|
||||
"code": 313,
|
||||
"name": "UnknownAction",
|
||||
"msg": "Unknown router action"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,837 @@
|
||||
{
|
||||
"version": "0.1.1",
|
||||
"name": "lifinity_amm_v2",
|
||||
"instructions": [
|
||||
{
|
||||
"name": "swap",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "authority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userTransferAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "sourceInfo",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "destinationInfo",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "swapSource",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "swapDestination",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "poolMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "feeAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "oracleMainAccount",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "oracleSubAccount",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "oraclePcAccount",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "amountIn",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "minimumAmountOut",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "depositAllTokenTypes",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "authority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userTransferAuthorityInfo",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "sourceAInfo",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "sourceBInfo",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenA",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenB",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "poolMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "destination",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "poolTokenAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "maximumTokenAAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "maximumTokenBAmount",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "withdrawAllTokenTypes",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "authority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userTransferAuthorityInfo",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "sourceInfo",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenA",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenB",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "poolMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "destTokenAInfo",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "destTokenBInfo",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "poolTokenAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "minimumTokenAAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "minimumTokenBAmount",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"accounts": [
|
||||
{
|
||||
"name": "Amm",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "initializerKey",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "initializerDepositTokenAccount",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "initializerReceiveTokenAccount",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "initializerAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "takerAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "isInitialized",
|
||||
"docs": [
|
||||
"Is the swap initialized, with data written to it"
|
||||
],
|
||||
"type": "bool"
|
||||
},
|
||||
{
|
||||
"name": "bumpSeed",
|
||||
"docs": [
|
||||
"Bump seed used to generate the program address / authority"
|
||||
],
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "freezeTrade",
|
||||
"docs": [
|
||||
"Freeze swap"
|
||||
],
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "freezeDeposit",
|
||||
"docs": [
|
||||
"Freeze deposit"
|
||||
],
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "freezeWithdraw",
|
||||
"docs": [
|
||||
"Freeze withdraw"
|
||||
],
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "baseDecimals",
|
||||
"docs": [
|
||||
"Base decimals account"
|
||||
],
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "tokenProgramId",
|
||||
"docs": [
|
||||
"Token program ID associated with the swap"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "tokenAAccount",
|
||||
"docs": [
|
||||
"Address of token A liquidity account"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "tokenBAccount",
|
||||
"docs": [
|
||||
"Address of token B liquidity account"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "poolMint",
|
||||
"docs": [
|
||||
"Address of pool token mint"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "tokenAMint",
|
||||
"docs": [
|
||||
"Address of token A mint"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "tokenBMint",
|
||||
"docs": [
|
||||
"Address of token B mint"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "feeAccount",
|
||||
"docs": [
|
||||
"Address of pool fee account"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "oracleMainAccount",
|
||||
"docs": [
|
||||
"Oracle Main account"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "oracleSubAccount",
|
||||
"docs": [
|
||||
"Oracle Sub account"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "oraclePcAccount",
|
||||
"docs": [
|
||||
"oracle Pc account"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "fees",
|
||||
"docs": [
|
||||
"Fees associated with swap"
|
||||
],
|
||||
"type": {
|
||||
"defined": "AmmFees"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "curve",
|
||||
"docs": [
|
||||
"Curve associated with swap"
|
||||
],
|
||||
"type": {
|
||||
"defined": "AmmCurve"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"docs": [
|
||||
"Curve associated with swap"
|
||||
],
|
||||
"type": {
|
||||
"defined": "AmmConfig"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "ammPTemp1",
|
||||
"docs": [
|
||||
"Temp area"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "ammPTemp2",
|
||||
"docs": [
|
||||
"Temp area"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "ammPTemp3",
|
||||
"docs": [
|
||||
"Temp area"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "ammPTemp4",
|
||||
"docs": [
|
||||
"Temp area"
|
||||
],
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "ammPTemp5",
|
||||
"docs": [
|
||||
"Temp area"
|
||||
],
|
||||
"type": "publicKey"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"types": [
|
||||
{
|
||||
"name": "AmmFees",
|
||||
"docs": [
|
||||
"Encapsulates all fee information and calculations for swap operations"
|
||||
],
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "tradeFeeNumerator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "tradeFeeDenominator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "ownerTradeFeeNumerator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "ownerTradeFeeDenominator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "ownerWithdrawFeeNumerator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "ownerWithdrawFeeDenominator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "hostFeeNumerator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "hostFeeDenominator",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "AmmCurve",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "curveType",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "curveParameters",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "AmmConfig",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "lastPrice",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "lastBalancedPrice",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "configDenominator",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "volumeX",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "volumeY",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "volumeXInY",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "depositCap",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "regressionTarget",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracleType",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracleStatus",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracleMainSlotLimit",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracleSubConfidenceLimit",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracleSubSlotLimit",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oraclePcConfidenceLimit",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oraclePcSlotLimit",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "stdSpread",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "stdSpreadBuffer",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "spreadCoefficient",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "priceBufferCoin",
|
||||
"type": "i64"
|
||||
},
|
||||
{
|
||||
"name": "priceBufferPc",
|
||||
"type": "i64"
|
||||
},
|
||||
{
|
||||
"name": "rebalanceRatio",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "feeTrade",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "feePlatform",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracleMainSlotBuffer",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "configTemp4",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "configTemp5",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "configTemp6",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "configTemp7",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "configTemp8",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "CurveType",
|
||||
"docs": [
|
||||
"Curve types supported by the token-swap program."
|
||||
],
|
||||
"type": {
|
||||
"kind": "enum",
|
||||
"variants": [
|
||||
{
|
||||
"name": "Standard"
|
||||
},
|
||||
{
|
||||
"name": "ConstantProduct"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"errors": [
|
||||
{
|
||||
"code": 6000,
|
||||
"name": "AlreadyInUse",
|
||||
"msg": "Swap account already in use"
|
||||
},
|
||||
{
|
||||
"code": 6001,
|
||||
"name": "InvalidProgramAddress",
|
||||
"msg": "Invalid program address generated from bump seed and key"
|
||||
},
|
||||
{
|
||||
"code": 6002,
|
||||
"name": "InvalidOwner",
|
||||
"msg": "Input account owner is not the program address"
|
||||
},
|
||||
{
|
||||
"code": 6003,
|
||||
"name": "InvalidOutputOwner",
|
||||
"msg": "Output pool account owner cannot be the program address"
|
||||
},
|
||||
{
|
||||
"code": 6004,
|
||||
"name": "ExpectedMint",
|
||||
"msg": "Deserialized account is not an SPL Token mint"
|
||||
},
|
||||
{
|
||||
"code": 6005,
|
||||
"name": "ExpectedAccount",
|
||||
"msg": "Deserialized account is not an SPL Token account"
|
||||
},
|
||||
{
|
||||
"code": 6006,
|
||||
"name": "EmptySupply",
|
||||
"msg": "Input token account empty"
|
||||
},
|
||||
{
|
||||
"code": 6007,
|
||||
"name": "InvalidSupply",
|
||||
"msg": "Pool token mint has a non-zero supply"
|
||||
},
|
||||
{
|
||||
"code": 6008,
|
||||
"name": "InvalidDelegate",
|
||||
"msg": "Token account has a delegate"
|
||||
},
|
||||
{
|
||||
"code": 6009,
|
||||
"name": "InvalidInput",
|
||||
"msg": "InvalidInput"
|
||||
},
|
||||
{
|
||||
"code": 6010,
|
||||
"name": "IncorrectSwapAccount",
|
||||
"msg": "Address of the provided swap token account is incorrect"
|
||||
},
|
||||
{
|
||||
"code": 6011,
|
||||
"name": "IncorrectPoolMint",
|
||||
"msg": "Address of the provided pool token mint is incorrect"
|
||||
},
|
||||
{
|
||||
"code": 6012,
|
||||
"name": "InvalidOutput",
|
||||
"msg": "InvalidOutput"
|
||||
},
|
||||
{
|
||||
"code": 6013,
|
||||
"name": "CalculationFailure",
|
||||
"msg": "General calculation failure due to overflow or underflow"
|
||||
},
|
||||
{
|
||||
"code": 6014,
|
||||
"name": "InvalidInstruction",
|
||||
"msg": "Invalid instruction"
|
||||
},
|
||||
{
|
||||
"code": 6015,
|
||||
"name": "RepeatedMint",
|
||||
"msg": "Swap input token accounts have the same mint"
|
||||
},
|
||||
{
|
||||
"code": 6016,
|
||||
"name": "ExceededSlippage",
|
||||
"msg": "Swap instruction exceeds desired slippage limit"
|
||||
},
|
||||
{
|
||||
"code": 6017,
|
||||
"name": "InvalidCloseAuthority",
|
||||
"msg": "Token account has a close authority"
|
||||
},
|
||||
{
|
||||
"code": 6018,
|
||||
"name": "InvalidFreezeAuthority",
|
||||
"msg": "Pool token mint has a freeze authority"
|
||||
},
|
||||
{
|
||||
"code": 6019,
|
||||
"name": "IncorrectFeeAccount",
|
||||
"msg": "Pool fee token account incorrect"
|
||||
},
|
||||
{
|
||||
"code": 6020,
|
||||
"name": "ZeroTradingTokens",
|
||||
"msg": "Given pool token amount results in zero trading tokens"
|
||||
},
|
||||
{
|
||||
"code": 6021,
|
||||
"name": "FeeCalculationFailure",
|
||||
"msg": "Fee calculation failed due to overflow, underflow, or unexpected 0"
|
||||
},
|
||||
{
|
||||
"code": 6022,
|
||||
"name": "ConversionFailure",
|
||||
"msg": "Conversion to u64 failed with an overflow or underflow"
|
||||
},
|
||||
{
|
||||
"code": 6023,
|
||||
"name": "InvalidFee",
|
||||
"msg": "The provided fee does not match the program owner's constraints"
|
||||
},
|
||||
{
|
||||
"code": 6024,
|
||||
"name": "IncorrectTokenProgramId",
|
||||
"msg": "The provided token program does not match the token program expected by the swap"
|
||||
},
|
||||
{
|
||||
"code": 6025,
|
||||
"name": "IncorrectOracleAccount",
|
||||
"msg": "Address of the provided oracle account is incorrect"
|
||||
},
|
||||
{
|
||||
"code": 6026,
|
||||
"name": "IncorrectConfigAccount",
|
||||
"msg": "Address of the provided config account is incorrect"
|
||||
},
|
||||
{
|
||||
"code": 6027,
|
||||
"name": "UnsupportedCurveType",
|
||||
"msg": "The provided curve type is not supported by the program owner"
|
||||
},
|
||||
{
|
||||
"code": 6028,
|
||||
"name": "InvalidCurve",
|
||||
"msg": "The provided curve parameters are invalid"
|
||||
},
|
||||
{
|
||||
"code": 6029,
|
||||
"name": "UnsupportedCurveOperation",
|
||||
"msg": "The operation cannot be performed on the given curve"
|
||||
},
|
||||
{
|
||||
"code": 6030,
|
||||
"name": "InvalidPythStatus",
|
||||
"msg": "Pyth oracle status is not 'trading'"
|
||||
},
|
||||
{
|
||||
"code": 6031,
|
||||
"name": "InvalidPythPrice",
|
||||
"msg": "Could not retrieve updated price feed from the Pyth oracle"
|
||||
},
|
||||
{
|
||||
"code": 6032,
|
||||
"name": "IncorrectSigner",
|
||||
"msg": "Address of the provided signer account is incorrect"
|
||||
},
|
||||
{
|
||||
"code": 6033,
|
||||
"name": "ExceedPoolBalance",
|
||||
"msg": "Swap amount exceeds pool balance"
|
||||
},
|
||||
{
|
||||
"code": 6034,
|
||||
"name": "ProgramIsFrozen",
|
||||
"msg": "Program is frozen"
|
||||
},
|
||||
{
|
||||
"code": 6035,
|
||||
"name": "OracleConfidence",
|
||||
"msg": "Oracle confidence is too high"
|
||||
},
|
||||
{
|
||||
"code": 6036,
|
||||
"name": "OverCapAmount",
|
||||
"msg": "Over Pool Cap Amount"
|
||||
},
|
||||
{
|
||||
"code": 6037,
|
||||
"name": "InvalidUpdateAccount",
|
||||
"msg": "Invalid update wallet address"
|
||||
},
|
||||
{
|
||||
"code": 6038,
|
||||
"name": "InvalidUpdateParam",
|
||||
"msg": "Invalid update param"
|
||||
},
|
||||
{
|
||||
"code": 6039,
|
||||
"name": "InvalidInnerSwapAccount",
|
||||
"msg": "Invalid inner swap account"
|
||||
},
|
||||
{
|
||||
"code": 6040,
|
||||
"name": "ExceptionErr",
|
||||
"msg": "Exception err"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,841 @@
|
||||
{
|
||||
"version": "0.5.0",
|
||||
"name": "amm",
|
||||
"instructions": [
|
||||
{
|
||||
"name": "createAmm",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "user",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "lpMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "baseMint",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "quoteMint",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaBase",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaQuote",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "associatedTokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "systemProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "args",
|
||||
"type": {
|
||||
"defined": "CreateAmmArgs"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "addLiquidity",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "user",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "lpMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userLpAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userBaseAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userQuoteAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaBase",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaQuote",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "args",
|
||||
"type": {
|
||||
"defined": "AddLiquidityArgs"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "removeLiquidity",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "user",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "lpMint",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userLpAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userBaseAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userQuoteAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaBase",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaQuote",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "args",
|
||||
"type": {
|
||||
"defined": "RemoveLiquidityArgs"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "swap",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "user",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userBaseAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "userQuoteAccount",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaBase",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaQuote",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "tokenProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "args",
|
||||
"type": {
|
||||
"defined": "SwapArgs"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "crankThatTwap",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "amm",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": []
|
||||
}
|
||||
],
|
||||
"accounts": [
|
||||
{
|
||||
"name": "Amm",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "bump",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "createdAtSlot",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "lpMint",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "baseMint",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "quoteMint",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "baseMintDecimals",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "quoteMintDecimals",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "baseAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "quoteAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracle",
|
||||
"type": {
|
||||
"defined": "TwapOracle"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "seqNum",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaBase",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaQuote",
|
||||
"type": "publicKey"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"types": [
|
||||
{
|
||||
"name": "CommonFields",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "slot",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "unixTimestamp",
|
||||
"type": "i64"
|
||||
},
|
||||
{
|
||||
"name": "user",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "amm",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "postBaseReserves",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "postQuoteReserves",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "oracleLastPrice",
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "oracleLastObservation",
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "oracleAggregator",
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "seqNum",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "AddLiquidityArgs",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "quoteAmount",
|
||||
"docs": [
|
||||
"How much quote token you will deposit to the pool"
|
||||
],
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "maxBaseAmount",
|
||||
"docs": [
|
||||
"The maximum base token you will deposit to the pool"
|
||||
],
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "minLpTokens",
|
||||
"docs": [
|
||||
"The minimum LP token you will get back"
|
||||
],
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "CreateAmmArgs",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "twapInitialObservation",
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "twapMaxObservationChangePerUpdate",
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "twapStartDelaySlots",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "RemoveLiquidityArgs",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "lpTokensToBurn",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "minQuoteAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "minBaseAmount",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "SwapArgs",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "swapType",
|
||||
"type": {
|
||||
"defined": "SwapType"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "inputAmount",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "outputAmountMin",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "TwapOracle",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "lastUpdatedSlot",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "lastPrice",
|
||||
"docs": [
|
||||
"A price is the number of quote units per base unit multiplied by 1e12.",
|
||||
"You cannot simply divide by 1e12 to get a price you can display in the UI",
|
||||
"because the base and quote decimals may be different. Instead, do:",
|
||||
"ui_price = (price * (10**(base_decimals - quote_decimals))) / 1e12"
|
||||
],
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "lastObservation",
|
||||
"docs": [
|
||||
"If we did a raw TWAP over prices, someone could push the TWAP heavily with",
|
||||
"a few extremely large outliers. So we use observations, which can only move",
|
||||
"by `max_observation_change_per_update` per update."
|
||||
],
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "aggregator",
|
||||
"docs": [
|
||||
"Running sum of slots_per_last_update * last_observation.",
|
||||
"",
|
||||
"Assuming latest observations are as big as possible (u64::MAX * 1e12),",
|
||||
"we can store 18 million slots worth of observations, which turns out to",
|
||||
"be ~85 days worth of slots.",
|
||||
"",
|
||||
"Assuming that latest observations are 100x smaller than they could theoretically",
|
||||
"be, we can store 8500 days (23 years) worth of them. Even this is a very",
|
||||
"very conservative assumption - META/USDC prices should be between 1e9 and",
|
||||
"1e15, which would overflow after 1e15 years worth of slots.",
|
||||
"",
|
||||
"So in the case of an overflow, the aggregator rolls back to 0. It's the",
|
||||
"client's responsibility to sanity check the assets or to handle an",
|
||||
"aggregator at T2 being smaller than an aggregator at T1."
|
||||
],
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "maxObservationChangePerUpdate",
|
||||
"docs": [
|
||||
"The most that an observation can change per update."
|
||||
],
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "initialObservation",
|
||||
"docs": [
|
||||
"What the initial `latest_observation` is set to."
|
||||
],
|
||||
"type": "u128"
|
||||
},
|
||||
{
|
||||
"name": "startDelaySlots",
|
||||
"docs": [
|
||||
"Number of slots after amm.created_at_slot to start recording TWAP"
|
||||
],
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "SwapType",
|
||||
"type": {
|
||||
"kind": "enum",
|
||||
"variants": [
|
||||
{
|
||||
"name": "Buy"
|
||||
},
|
||||
{
|
||||
"name": "Sell"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"events": [
|
||||
{
|
||||
"name": "SwapEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "common",
|
||||
"type": {
|
||||
"defined": "CommonFields"
|
||||
},
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "inputAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "outputAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "swapType",
|
||||
"type": {
|
||||
"defined": "SwapType"
|
||||
},
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "AddLiquidityEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "common",
|
||||
"type": {
|
||||
"defined": "CommonFields"
|
||||
},
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "quoteAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "maxBaseAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "minLpTokens",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "baseAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "lpTokensMinted",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "RemoveLiquidityEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "common",
|
||||
"type": {
|
||||
"defined": "CommonFields"
|
||||
},
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "lpTokensBurned",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "minQuoteAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "minBaseAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "baseAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "quoteAmount",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CreateAmmEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "common",
|
||||
"type": {
|
||||
"defined": "CommonFields"
|
||||
},
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "twapInitialObservation",
|
||||
"type": "u128",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "twapMaxObservationChangePerUpdate",
|
||||
"type": "u128",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "lpMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "baseMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "quoteMint",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaBase",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "vaultAtaQuote",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CrankThatTwapEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "common",
|
||||
"type": {
|
||||
"defined": "CommonFields"
|
||||
},
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"errors": [
|
||||
{
|
||||
"code": 6000,
|
||||
"name": "AssertFailed",
|
||||
"msg": "An assertion failed"
|
||||
},
|
||||
{
|
||||
"code": 6001,
|
||||
"name": "NoSlotsPassed",
|
||||
"msg": "Can't get a TWAP before some observations have been stored"
|
||||
},
|
||||
{
|
||||
"code": 6002,
|
||||
"name": "NoReserves",
|
||||
"msg": "Can't swap through a pool without token reserves on either side"
|
||||
},
|
||||
{
|
||||
"code": 6003,
|
||||
"name": "InputAmountOverflow",
|
||||
"msg": "Input token amount is too large for a swap, causes overflow"
|
||||
},
|
||||
{
|
||||
"code": 6004,
|
||||
"name": "AddLiquidityCalculationError",
|
||||
"msg": "Add liquidity calculation error"
|
||||
},
|
||||
{
|
||||
"code": 6005,
|
||||
"name": "DecimalScaleError",
|
||||
"msg": "Error in decimal scale conversion"
|
||||
},
|
||||
{
|
||||
"code": 6006,
|
||||
"name": "SameTokenMints",
|
||||
"msg": "You can't create an AMM pool where the token mints are the same"
|
||||
},
|
||||
{
|
||||
"code": 6007,
|
||||
"name": "SwapSlippageExceeded",
|
||||
"msg": "A user wouldn't have gotten back their `output_amount_min`, reverting"
|
||||
},
|
||||
{
|
||||
"code": 6008,
|
||||
"name": "InsufficientBalance",
|
||||
"msg": "The user had insufficient balance to do this"
|
||||
},
|
||||
{
|
||||
"code": 6009,
|
||||
"name": "ZeroLiquidityRemove",
|
||||
"msg": "Must remove a non-zero amount of liquidity"
|
||||
},
|
||||
{
|
||||
"code": 6010,
|
||||
"name": "ZeroLiquidityToAdd",
|
||||
"msg": "Cannot add liquidity with 0 tokens on either side"
|
||||
},
|
||||
{
|
||||
"code": 6011,
|
||||
"name": "ZeroMinLpTokens",
|
||||
"msg": "Must specify a non-zero `min_lp_tokens` when adding to an existing pool"
|
||||
},
|
||||
{
|
||||
"code": 6012,
|
||||
"name": "AddLiquiditySlippageExceeded",
|
||||
"msg": "LP wouldn't have gotten back `lp_token_min`"
|
||||
},
|
||||
{
|
||||
"code": 6013,
|
||||
"name": "AddLiquidityMaxBaseExceeded",
|
||||
"msg": "LP would have spent more than `max_base_amount`"
|
||||
},
|
||||
{
|
||||
"code": 6014,
|
||||
"name": "InsufficientQuoteAmount",
|
||||
"msg": "`quote_amount` must be greater than 100000000 when initializing a pool"
|
||||
},
|
||||
{
|
||||
"code": 6015,
|
||||
"name": "ZeroSwapAmount",
|
||||
"msg": "Users must swap a non-zero amount"
|
||||
},
|
||||
{
|
||||
"code": 6016,
|
||||
"name": "ConstantProductInvariantFailed",
|
||||
"msg": "K should always be increasing"
|
||||
},
|
||||
{
|
||||
"code": 6017,
|
||||
"name": "CastingOverflow",
|
||||
"msg": "Casting has caused an overflow"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,996 @@
|
||||
{
|
||||
"version": "0.1.0",
|
||||
"name": "executor",
|
||||
"instructions": [
|
||||
{
|
||||
"name": "initExecutor",
|
||||
"docs": [
|
||||
"--------------------------- Owner Instructions ---------------------------"
|
||||
],
|
||||
"accounts": [
|
||||
{
|
||||
"name": "payer",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "systemProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "InitExecutorParams"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ownerSetConfig",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "owner",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "OwnerSetConfigParams"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "adminSetConfig",
|
||||
"docs": [
|
||||
"--------------------------- Admin Instructions ---------------------------"
|
||||
],
|
||||
"accounts": [
|
||||
{
|
||||
"name": "admin",
|
||||
"isMut": false,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "AdminSetConfigParams"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "nativeDrop",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "executor",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"isMut": true,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "systemProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false,
|
||||
"docs": [
|
||||
"For native drop transfer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "NativeDropParams"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "execute",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "executor",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "endpointProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "endpointEventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false,
|
||||
"docs": [
|
||||
"The authority for the endpoint program to emit events"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "ExecuteParams"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "compose",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "executor",
|
||||
"isMut": true,
|
||||
"isSigner": true
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "endpointProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "endpointEventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false,
|
||||
"docs": [
|
||||
"The authority for the endpoint program to emit events"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "eventAuthority",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "program",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "ComposeParams"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "quoteExecutor",
|
||||
"docs": [
|
||||
"--------------------------- MsgLib Instructions ---------------------------"
|
||||
],
|
||||
"accounts": [
|
||||
{
|
||||
"name": "executorConfig",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "priceFeedProgram",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "priceFeedConfig",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "QuoteExecutorParams"
|
||||
}
|
||||
}
|
||||
],
|
||||
"returns": "u64"
|
||||
},
|
||||
{
|
||||
"name": "executable",
|
||||
"accounts": [
|
||||
{
|
||||
"name": "nonce",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
},
|
||||
{
|
||||
"name": "payloadHash",
|
||||
"isMut": false,
|
||||
"isSigner": false
|
||||
}
|
||||
],
|
||||
"args": [
|
||||
{
|
||||
"name": "params",
|
||||
"type": {
|
||||
"defined": "ExecutableParams"
|
||||
}
|
||||
}
|
||||
],
|
||||
"returns": {
|
||||
"defined": "ExecutionState"
|
||||
}
|
||||
}
|
||||
],
|
||||
"accounts": [
|
||||
{
|
||||
"name": "Nonce",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "bump",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "outboundNonce",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "inboundNonce",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "ExecutorConfig",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "bump",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "owner",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "acl",
|
||||
"type": {
|
||||
"defined": "Acl"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "admins",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "executors",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "msglibs",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "paused",
|
||||
"type": "bool"
|
||||
},
|
||||
{
|
||||
"name": "defaultMultiplierBps",
|
||||
"type": "u16"
|
||||
},
|
||||
{
|
||||
"name": "priceFeed",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "dstConfigs",
|
||||
"type": {
|
||||
"vec": {
|
||||
"defined": "DstConfig"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"types": [
|
||||
{
|
||||
"name": "AdminSetConfigParams",
|
||||
"type": {
|
||||
"kind": "enum",
|
||||
"variants": [
|
||||
{
|
||||
"name": "PriceFeed",
|
||||
"fields": [
|
||||
"publicKey"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DefaultMultiplierBps",
|
||||
"fields": [
|
||||
"u16"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DstConfigs",
|
||||
"fields": [
|
||||
{
|
||||
"vec": {
|
||||
"defined": "DstConfig"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "ComposeParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "lzCompose",
|
||||
"type": {
|
||||
"defined": "LzComposeParams"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "computeUnits",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "value",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "ExecutableParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "receiver",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "srcEid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "sender",
|
||||
"type": {
|
||||
"array": [
|
||||
"u8",
|
||||
32
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nonce",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "ExecutionState",
|
||||
"type": {
|
||||
"kind": "enum",
|
||||
"variants": [
|
||||
{
|
||||
"name": "NotExecutable"
|
||||
},
|
||||
{
|
||||
"name": "VerifiedButNotExecutable"
|
||||
},
|
||||
{
|
||||
"name": "Executable"
|
||||
},
|
||||
{
|
||||
"name": "Executed"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "ExecuteParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "receiver",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "lzReceive",
|
||||
"type": {
|
||||
"defined": "LzReceiveParams"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "value",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "computeUnits",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "InitExecutorParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "owner",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "admins",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "executors",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "msglibs",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "priceFeed",
|
||||
"type": "publicKey"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "NativeDropParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "srcEid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "sender",
|
||||
"type": {
|
||||
"array": [
|
||||
"u8",
|
||||
32
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nonce",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "dstEid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "oapp",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "nativeDropRequests",
|
||||
"type": {
|
||||
"vec": {
|
||||
"defined": "NativeDropRequest"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "NativeDropRequest",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "receiver",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "amount",
|
||||
"type": "u64"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "OwnerSetConfigParams",
|
||||
"type": {
|
||||
"kind": "enum",
|
||||
"variants": [
|
||||
{
|
||||
"name": "Admins",
|
||||
"fields": [
|
||||
{
|
||||
"vec": "publicKey"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Executors",
|
||||
"fields": [
|
||||
{
|
||||
"vec": "publicKey"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Msglibs",
|
||||
"fields": [
|
||||
{
|
||||
"vec": "publicKey"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Owner",
|
||||
"fields": [
|
||||
"publicKey"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Paused",
|
||||
"fields": [
|
||||
"bool"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Allowlist",
|
||||
"fields": [
|
||||
{
|
||||
"vec": "publicKey"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Denylist",
|
||||
"fields": [
|
||||
{
|
||||
"vec": "publicKey"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "DstConfig",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "eid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "lzReceiveBaseGas",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "lzComposeBaseGas",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "multiplierBps",
|
||||
"type": {
|
||||
"option": "u16"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "floorMarginUsd",
|
||||
"type": {
|
||||
"option": "u128"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nativeDropCap",
|
||||
"type": "u128"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "LzComposeParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "from",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "to",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "guid",
|
||||
"type": {
|
||||
"array": [
|
||||
"u8",
|
||||
32
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "index",
|
||||
"type": "u16"
|
||||
},
|
||||
{
|
||||
"name": "message",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"name": "extraData",
|
||||
"type": "bytes"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "LzReceiveParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "srcEid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "sender",
|
||||
"type": {
|
||||
"array": [
|
||||
"u8",
|
||||
32
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nonce",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "guid",
|
||||
"type": {
|
||||
"array": [
|
||||
"u8",
|
||||
32
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "message",
|
||||
"type": "bytes"
|
||||
},
|
||||
{
|
||||
"name": "extraData",
|
||||
"type": "bytes"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "LzOption",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "optionType",
|
||||
"type": "u8"
|
||||
},
|
||||
{
|
||||
"name": "params",
|
||||
"type": "bytes"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "QuoteExecutorParams",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "msglib",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "dstEid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "sender",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "calldataSize",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "options",
|
||||
"type": {
|
||||
"vec": {
|
||||
"defined": "LzOption"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Acl",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "allowList",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "denyList",
|
||||
"type": {
|
||||
"vec": "publicKey"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "NativeDropAppliedEvent",
|
||||
"type": {
|
||||
"kind": "struct",
|
||||
"fields": [
|
||||
{
|
||||
"name": "srcEid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "sender",
|
||||
"type": {
|
||||
"array": [
|
||||
"u8",
|
||||
32
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nonce",
|
||||
"type": "u64"
|
||||
},
|
||||
{
|
||||
"name": "dstEid",
|
||||
"type": "u32"
|
||||
},
|
||||
{
|
||||
"name": "oapp",
|
||||
"type": "publicKey"
|
||||
},
|
||||
{
|
||||
"name": "nativeDropRequests",
|
||||
"type": {
|
||||
"vec": {
|
||||
"defined": "NativeDropRequest"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "successes",
|
||||
"type": {
|
||||
"vec": "bool"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"events": [
|
||||
{
|
||||
"name": "NativeDropAppliedEvent",
|
||||
"fields": [
|
||||
{
|
||||
"name": "srcEid",
|
||||
"type": "u32",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "sender",
|
||||
"type": {
|
||||
"array": [
|
||||
"u8",
|
||||
32
|
||||
]
|
||||
},
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "nonce",
|
||||
"type": "u64",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "dstEid",
|
||||
"type": "u32",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "oapp",
|
||||
"type": "publicKey",
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "nativeDropRequests",
|
||||
"type": {
|
||||
"vec": {
|
||||
"defined": "NativeDropRequest"
|
||||
}
|
||||
},
|
||||
"index": false
|
||||
},
|
||||
{
|
||||
"name": "successes",
|
||||
"type": {
|
||||
"vec": "bool"
|
||||
},
|
||||
"index": false
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"errors": [
|
||||
{
|
||||
"code": 6000,
|
||||
"name": "InvalidSize"
|
||||
},
|
||||
{
|
||||
"code": 6001,
|
||||
"name": "Paused"
|
||||
},
|
||||
{
|
||||
"code": 6002,
|
||||
"name": "UnsupportedOptionType"
|
||||
},
|
||||
{
|
||||
"code": 6003,
|
||||
"name": "ZeroLzComposeGasProvided"
|
||||
},
|
||||
{
|
||||
"code": 6004,
|
||||
"name": "ZeroLzReceiveGasProvided"
|
||||
},
|
||||
{
|
||||
"code": 6005,
|
||||
"name": "NativeAmountExceedsCap"
|
||||
},
|
||||
{
|
||||
"code": 6006,
|
||||
"name": "NotAdmin"
|
||||
},
|
||||
{
|
||||
"code": 6007,
|
||||
"name": "NotExecutor"
|
||||
},
|
||||
{
|
||||
"code": 6008,
|
||||
"name": "MsgLibNotAllowed"
|
||||
},
|
||||
{
|
||||
"code": 6009,
|
||||
"name": "TooManyAdmins"
|
||||
},
|
||||
{
|
||||
"code": 6010,
|
||||
"name": "TooManyExecutors"
|
||||
},
|
||||
{
|
||||
"code": 6011,
|
||||
"name": "TooManyOptionTypes"
|
||||
},
|
||||
{
|
||||
"code": 6012,
|
||||
"name": "InvalidNativeDropRequestsLength"
|
||||
},
|
||||
{
|
||||
"code": 6013,
|
||||
"name": "InvalidNativeDropReceiver"
|
||||
},
|
||||
{
|
||||
"code": 6014,
|
||||
"name": "InsufficientBalance"
|
||||
},
|
||||
{
|
||||
"code": 6015,
|
||||
"name": "EidNotSupported"
|
||||
},
|
||||
{
|
||||
"code": 6016,
|
||||
"name": "ExecutorIsAdmin"
|
||||
},
|
||||
{
|
||||
"code": 6017,
|
||||
"name": "InvalidOwner"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user