Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →

Qu’est-ce qu’un IDL

Les programmes Anchor sur Solana publient un fichier IDL (Interface Definition Language) décrivant leurs instructions, les dispositions des comptes, l’énumération des erreurs et les schémas de structures. L’IDL est la source de vérité pour la génération de code client — le SDK TS, la crate CPI Rust et les clients tiers sont tous générés à partir de celui-ci (ou écrits manuellement contre lui). Raydium publie des IDLs pour CPMM, CLMM et LaunchLab. AMM v4, Stable AMM et Farm (v3 / v5 / v6) sont antérieurs à Anchor ou ne sont pas distribués par Anchor — leurs structures de compte sont maintenues manuellement dans le SDK.

Où les trouver

Les IDLs se trouvent dans un dépôt dédié :
Les fichiers exacts : Les fichiers IDL sont versionnés dans l’historique git du dépôt ; épinglez à un commit spécifique si vous avez besoin d’une reproductibilité byte-for-byte. Certains IDLs peuvent également être extraits directement du mainnet :
Il existe maintenant deux mécanismes d’IDL on-chain, et les programmes de Raydium sont répartis entre eux — ce qui importe car une version donnée d’Anchor CLI ne peut connaître qu’un seul :
CPMM n’a pas de compte anchor:idl hérité. Son IDL a été migré vers le programme Program Metadata, donc anchor idl fetch CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C échoue sur tout Anchor CLI qui ne vérifie que le PDA hérité. Utilisez l’IDL fourni avec le SDK, ou lisez le compte de métadonnées ci-dessus, jusqu’à ce que votre CLI supporte le programme de métadonnées.
Les trois comptes IDL hérités sont modifiables par l’autorité IDL 2XVnob28A5Qnpcy95UVeHWNT6G8Poy3tpA3AFyAMoZDt, qui est distincte de l’autorité de mise à niveau BPF des programmes — donc un IDL peut être actualisé sans redéploiement, et peut aussi être en retard sur un redéploiement. Traitez l’IDL on-chain comme une commodité, pas comme une preuve de la forme du bytecode déployé.

Régénérer un client TypeScript

La génération de code d’Anchor produit un client typé à partir de l’IDL :
La plupart des intégrateurs ne font pas cela — ils utilisent l’assistant de niveau supérieur raydium.cpmm.swap(...) qui enveloppe les méthodes Anchor plus toute la comptabilité (création d’ATA, ajustement des frais de transfert, budget de calcul, routage du programme Token-2022). Régénérez uniquement quand vous avez besoin d’une couche en dessous du SDK.

Régénérer un client Rust (crate CPI)

Raydium publie des crates Anchor pour les programmes qui ont des IDLs :
Dans le code, référencez-les par leurs noms lib, raydium_cp_swap et raydium_clmm. Il n’existe pas de crate appelée raydium_amm_v3 sous aucune orthographe. Notez que les branches diffèrent : la branche master de raydium-cp-swap épingle toujours anchor-lang 0.32.1, donc une intégration Anchor-1.0 a besoin de chore/upgrade-anchor ; CLMM est sur 0.32.1 de toute façon, c’est pourquoi les deux ne peuvent pas partager une crate. La fonctionnalité cpi expose les structures de compte cpi::accounts::<Ix> et les invocateurs cpi::<ix>() — des wrappers CPI prêts à l’emploi. Voir sdk-api/rust-cpi pour les modèles d’utilisation. Si vous préférez générer des liaisons fraîches :

Régénérer un client Python

Il n’existe pas de SDK Python officiel Raydium. Les générateurs tiers incluent :
  • anchorpy — port Python du client TypeScript d’Anchor. Génère des constructeurs de méthodes typés à partir d’IDLs.
  • solders — primitives Solana de bas niveau (transactions, paires de clés, clés publiques) dans les liaisons Rust ; utilisé sous anchorpy.
Voir sdk-api/python-integration pour une présentation plus complète.

Politique de changement d’IDL

Raydium suit ces règles pour la stabilité de l’IDL :
  1. Les discriminateurs d’instruction ne changent jamais. L’ajout de nouvelles instructions étend l’énumération à la fin ; les discriminateurs existants restent stables.
  2. Les tailles de compte sont stables ; les nouveaux champs sortent du remplissage réservé. Chaque structure d’état Raydium porte une région de remplissage finale dimensionnée à la création, et un nouveau champ est extrait de ce remplissage plutôt qu’ajouté — donc la longueur en octets du compte et les décalages de tous les champs pré-existants restent fixes. Le corollaire est que les octets que vous lisiez précédemment comme remplissage peuvent devenir significatifs, et un champ peut être retiré dans le remplissage (comme PlatformConfig.curve_params l’a été dans la version du 2026-08-31). Relisez la définition de la structure après une mise à niveau ; ne supposez pas que le remplissage reste zéro.
  3. Les codes d’énumération d’erreur sont append-only. Un code d’erreur existant signifie toujours la même chose.
  4. Les changements de rupture sont livrés dans de nouveaux programmes. Quand une refonte est nécessaire, l’équipe déploie un nouvel ID de programme (par exemple CPMM comme un programme frais plutôt que de mettre à niveau AMM v4). Les anciens pools continuent à fonctionner sur l’ancien programme ; les nouveaux pools vont au nouveau.
Cette politique maintient les clients régénérés largement rétro-compatibles : un client généré contre un IDL plus ancien continue de décoder les champs qu’il connaît, aux décalages qu’il connaît. Ce qu’il ne verra pas, c’est un champ extrait de ce qu’il traite toujours comme du remplissage — et, dans le rare cas de retraite, un champ qu’il décode peut ne plus être écrit. Il ne voit pas « d’octets de fin supplémentaires » : la longueur du compte ne change pas.

Que faire quand l’IDL change

  1. Mettez à jour le SDK. npm update @raydium-io/raydium-sdk-v2.
  2. Régénérez votre code client si vous utilisez la génération de code Anchor directement.
  3. Comparez la disposition du compte. Les champs de fin de la nouvelle disposition sont la seule chose que votre code n’a pas vue ; confirmez si vous en avez besoin.
  4. Ne supposez pas que les anciens discriminateurs d’instruction sont invalides. Selon la règle 1, ils fonctionnent toujours.
  5. Réexécutez les tests d’intégration contre devnet avant de passer au mainnet.

Dépannage d’IDL

Erreurs « Invalid discriminator »

Signifie généralement qu’un client construit contre la version N de l’IDL essaie d’invoquer une instruction qui n’existait que dans une version pré-déploiement du programme. Retirez l’IDL du programme en direct :
Pour CPMM, cela ne fonctionnera pas — voir le tableau des emplacements d’IDL ci-dessus ; tirez plutôt l’IDL fourni avec le SDK.

Échecs de décodage de compte

Si program.account.<Name>.fetch(pubkey) lève une exception avec « Invalid account discriminator », le compte a été créé par une version précédente du programme et Anchor rejette son discriminateur de 8 octets. La solution consiste à utiliser l’analyseur de disposition brute du SDK (PoolInfoLayout.decode(accountData)) qui n’applique pas les discriminateurs Anchor.

Instructions manquantes dans le client généré

La génération de code TS d’Anchor ne génère des méthodes que pour les instructions dont l’entrée IDL a un name qui s’analyse comme un identifiant valide. Les instructions de Raydium satisfont toutes à cela, mais si vous voyez une discordance, vérifiez si le fichier IDL provient de la version actuelle du SDK.

Pointeurs

Sources :