Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Les programmes produits de Raydium sont des bases de code indépendantes, mais ils ont été conçus selon un ensemble de conventions partagées. Cette page est la référence canonique pour ces conventions. Les chapitres par produit décrivent comment les conventions sont instanciées dans leurs comptes ; cette page décrit les conventions elles-mêmes.
Ce que « partagé » signifie ici
Trois formes de partage traversent la base de code :- Partage de convention. Chaque programme utilise le même motif de dérivation PDA, la même forme de répartition des frais et la même idée de compte d’observation — mais chacun les implémente dans son propre programme avec ses propres seeds.
- Partage de compte. Une poignée de comptes sont littéralement le même enregistrement sur plusieurs pools (le PDA d’autorité global en CPMM, les comptes AmmConfig).
- Partage hors chaîne. Une API REST et un SDK TypeScript font face à tous les quatre programmes. Les intégrateurs interagissent avec un seul hôte HTTP et un seul paquet NPM, quel que soit le programme qu’ils finissent par appeler.
1. PDAs d’autorité
Chaque programme Raydium a exactement un PDA qui possède ses coffres de jetons. Les utilisateurs ne détiennent jamais directement l’autorité du coffre — le PDA d’autorité est le seul signataire qui peut déplacer les fonds, et il ne signe que lorsqu’une instruction de programme valide le lui demande. Le motif est identique sur tous les produits ; les seeds diffèrent :
Quelques conséquences en découlent :
- Pour CPMM et CLMM, le PDA d’autorité est un compte global — chaque pool de ce type l’utilise. Si vous faites un CPI dans CPMM, vous en avez besoin une fois, pas par pool.
- Pour les autorités par pool / par ferme, vous dérivez le PDA à partir de l’ID du pool/ferme. Le SDK le fait dans
getPoolKeys/getFarmKeys; si vous intégrez directement, vous dérivez avecfindProgramAddressSync. - La propriété du coffre ne peut pas être modifiée. Une fois qu’un compte de jeton est créé avec le PDA d’autorité comme propriétaire, seul ce PDA — invoqué par le programme — peut transférer. Il n’y a pas de remplacement administrateur.
products/cpmm/accounts, products/clmm/accounts, products/amm-v4/accounts, products/farm-staking/accounts, products/launchlab/accounts.
2. Comptes d’administration et de configuration
CPMM et CLMM partagent un motif de compte de configuration appeléAmmConfig : un petit compte global, indexé par un u16, contenant les taux de frais et les destinations d’administration qui s’appliquent à un palier de frais entier. Les pools se lient à une configuration à la création et ne se lient jamais à nouveau.
- Les paliers de frais sont globaux. Quand un pool dit « c’est un pool à 0,25% », cela signifie qu’il se lie au AmmConfig dont le
trade_fee_rateétait 0,25% au moment de la création. Il n’y a pas de remplacement de taux par pool. - Une configuration peut être modifiée mais les pools ne la suivent pas. Si l’autorité de configuration modifie un AmmConfig, chaque pool existant lié à cette configuration récupère immédiatement le nouveau taux. C’est une fonctionnalité, pas un bug ; c’est ainsi que les changements économiques au niveau du protocole se propagent sans migrations par pool.
disable_create_poolest le levier de dépréciation. Quand un palier de frais est supprimé, le multisig du protocole définit cet indicateur — les pools existants continuent de fonctionner mais aucun nouveau pool ne peut choisir le palier.protocol_owner/fund_ownersont les signataires pour les appels de collecte de frais. Les définir sur un multisig est ce qui contrôle le retrait des frais. Ce ne sont PAS les adresses de destination des frais eux-mêmes ; c’estprotocol_fee_destination/fund_fee_destinationsur le même compte.
AmmConfig — ses paramètres de frais sont par pool, codés en dur à la création. Farm et LaunchLab ont leurs propres équivalents (FarmConfig, LaunchConfig) couverts dans leurs chapitres respectifs.
Un tableau complet de qui peut modifier quoi se trouve dans security/admin-and-multisig. Les répartitions de frais actuelles visibles par l’utilisateur se trouvent dans ray/protocol-fees.
3. La répartition des frais protocole / fonds / créateur
Chaque frais de swap CPMM et CLMM est réparti sur jusqu’à quatre destinations en sortie :- Les frais de transaction s’accumulent dans le pool. Les frais sont prélevés du côté d’entrée du swap et le montant après frais est ce que les mathématiques du produit constant voient. C’est ce que « le LP gagne les frais » signifie —
kaugmente et la valeur implicite par jeton LP aussi. - Les portions protocole/fonds/créateur sont déduites de cette accumulation du côté LP dans des comptes de compteur par pool. Elles se trouvent sur l’état du pool (
protocol_fees_token{0,1},fund_fees_token{0,1}, etc.) jusqu’à ce que quelqu’un appelle l’instruction de collecte correspondante. Elles ne quittent pas les coffres du pool jusqu’à ce moment ; du point de vue d’un swap, elles sont toujours « dans le pool ». - La collecte les déplace. Les chemins protocole et fonds nécessitent le signataire respectif
protocol_owner/fund_ownerdeAmmConfig. Les frais de créateur CPMM utilisent soit le cheminCollectCreatorFeesigné par le créateur, soitCollectCreatorFeePermissionless, que n’importe quel payeur peut déclencher mais qui fixe les destinations aux ATAs canoniques du créateur.
- Les pourcentages de répartition sont sur les frais de transaction, pas sur la transaction. Un frais de transaction de 0,25% avec une part de protocole de 12% signifie que le protocole obtient
0,25% × 12% = 0,03%de la transaction — pas 12% de la transaction. - Les frais de créateur n’existent que sur les pools diplômés de LaunchLab. Les pools CPMM/CLMM standard ont une répartition à 3 voies (LP / protocole / fonds). LaunchLab ajoute un quatrième slot acheminé vers celui qui a lancé le jeton, configuré à
Initializeet immuable. - AMM v4 se divise en deux voies seulement, codées en dur par pool : LP et protocole. Pas de slot fonds, pas de slot créateur.
- Fonds vs protocole — les deux sont des destinations de trésorerie du protocole, mais ils ont des signataires différents et des utilisations prévues différentes.
protocolfinance historiquement les opérations ;fundest la trésorerie à plus long terme. La répartition entre les deux est elle-même réglable.
reference/fee-comparison et ray/protocol-fees.
4. Comptes d’observation (tampon annulaire TWAP)
CPMM et CLMM maintiennent un compte d’observation par pool — un tampon annulaire de taille fixe d’échantillons(timestamp, cumulative_price) que d’autres contrats peuvent utiliser pour dériver un TWAP résistant à la manipulation.
- Chaque swap appelle
update_observation. Le programme lit le prix actuel, le multiplie par les secondes écoulées depuis l’observation précédente, et l’ajoute au compteur cumulatif. La nouvelle entrée écrase le slot le plus ancien (style tampon annulaire). - TWAP sur une fenêtre =
(cumul[end] − cumul[start]) / (timestamp[end] − timestamp[start]). Les consommateurs choisissent deux observations encadrant la fenêtre souhaitée et divisent. - Raydium lui-même n’utilise pas le TWAP pour la tarification. Les mathématiques AMM lisent directement les réserves au comptant. Les observations sont une externalité — Raydium paie le coût de les écrire pour que d’autres contrats puissent les lire.
- AMM v4 n’a pas de compte d’observation. Il est plus ancien que la conception ObservationState ; les intégrateurs voulant un TWAP v4 doivent en calculer un hors chaîne à partir de l’historique des journaux.
products/cpmm/accounts et products/clmm/accounts.
5. API REST + SDK + IDL
La surface hors chaîne est un trio unique utilisé par chaque produit :- API REST —
https://api-v3.raydium.io. Une vue indexée en lecture seule de tout l’état on-chaîne plus un moteur de devis. Un hôte, un schéma. - SDK TypeScript —
@raydium-io/raydium-sdk-v2sur NPM. Construit et signe les transactions pour chaque programme. Parle à l’API pour les devis/métadonnées, parle à un RPC Solana pour les actualisations d’état avant signature. - Registre IDL — Les IDLs Anchor pour chaque programme publié vivent dans le dépôt
raydium-idl(un JSON par programme : CPMM, CLMM, LaunchLab). Le SDK TypeScript consomme ces IDLs en interne ; les clients Rust / Python en aval régénèrent à partir des mêmes fichiers.
Une erreur courante est d’alimenter directement la sortie de l’API REST dans une transaction. Ne le faites pas — réactualisez l’état pertinent du pool/position à partir d’un RPC Solana dans le slot que vous signez. Le SDK le fait automatiquement pour les flux de première partie ; si vous contournez le SDK, vous devez le faire vous-même.
La référence complète se trouve dans
sdk-api/, avec la surface IDL spécifiquement dans sdk-api/anchor-idl.
6. Indexeurs et flux de prix
L’API REST est alimentée par l’indexeur propre de Raydium, qui s’abonne aux journaux de programme d’une flotte de RPCs Solana et écrit des enregistrements dénormalisés dans un magasin SQL. Deux conséquences pour les intégrateurs :- L’indexeur est la seule chose qui « connaît » l’état inter-programmes. Mapper un pool CPMM à son homologue CLMM, calculer un nombre de volume sur 24h sur les versions de programme, récupérer une ferme associée à un mint LP — tout cela est du travail d’indexeur. Les programmes eux-mêmes ne le font pas.
- Le temps d’arrêt de l’indexeur est le temps d’arrêt de l’API. Si l’API retourne des données obsolètes ou vides, l’indexeur est le suspect. L’état on-chaîne n’est pas affecté ; les intégrateurs avec leur propre RPC et SDK peuvent continuer à effectuer des transactions.
priceUsd sur la plupart des réponses de pool ; ceci est calculé hors chaîne à partir d’un instantané de la vue de l’indexeur des réserves du pool et d’un prix de référence cité (les pools USDC comme pivot commun). C’est assez bon pour l’interface utilisateur ; ce n’est pas sûr à utiliser comme oracle on-chaîne. Utilisez le TWAP d’observation pour cela.
Ce qui n’est pas partagé
Cela vaut la peine de lister explicitement, car les nouveaux lecteurs supposent souvent plus de partage qu’il n’en existe :- Les programmes ne s’appellent pas les uns les autres. Un swap CPMM ne fait jamais de CPI dans CLMM ou AMM v4. Le seul programme qui compose plusieurs AMMs est le programme AMM Routing — et celui-ci est lui-même mince, émettant simplement des CPIs dans chaque AMM en séquence.
- Pas d’autorité de mise à niveau partagée sur les programmes. Chaque programme on-chaîne a sa propre clé de mise à niveau de programme (un multisig 3/4 plus un verrouillage temporel de 24h). Elles ne sont pas liées.
- Pas d’état partagé entre les fermes et les AMMs. Une ferme ne sait pas si le LP qu’elle met en jeu provient d’un pool CPMM, d’un mint NFT de position CLMM ou d’un jeton SPL non lié. Le programme de ferme traite le mint de mise en jeu comme opaque.
- Pas de dépendance d’oracle. La tarification est sur les réserves on-chaîne. Il n’y a pas de secours Pyth/Switchboard ; l’AMM ne vérifie pas un oracle avant de compenser.
Pointeurs
protocol-overview/architecture— le diagramme canonique montrant comment ces pièces se composent.protocol-overview/versions-and-migration— comment les conventions ont évolué sur les versions de programme.security/admin-and-multisig— qui contrôle les clés derrière les AmmConfigs.reference/fee-comparison— matrice des taux de frais par produit.reference/program-addresses— IDs de programme canoniques.
- Raydium SDK v2 — la source de vérité pour les seeds PDA, les dispositions de compte et les définitions IDL.
- Registre IDL Raydium — IDLs Anchor.
- Pages de comptes par produit citées en ligne ci-dessus.

