Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
À partir de la mise à jour 2026-07, la dépendance OpenBook / Serum d’AMM v4 a été supprimée — aucune instruction ne lit ou n’écrit plus l’état OpenBook. Les comptes de marché ci-dessous sont conservés uniquement comme espaces réservés positionnels sur les anciens layouts d’instructions v1 (acceptés mais ignorés) et comme champs de référence sur AmmInfo. Utilisez les points d’entrée de swap V2, qui les omettent entièrement. Cette page regroupe toujours les comptes en sections « appartenant au pool » et « OpenBook (hérité) » pour la lecture des anciennes transactions.

Inventaire

Un pool AMM v4 enregistre un marché lié sur AmmInfo à la création. Le tableau complet : Remarque : le préfixe « serum » est conservé dans l’IDL et les noms de champs d’AMM v4 pour la compatibilité rétroactive. Ces comptes ne sont plus fonctionnels après la suppression d’OpenBook.

AmmInfo

Le compte d’état racine du pool. Grand (≈ 752 octets) car il porte à la fois les références du pool et d’OpenBook en ligne.
Le layout de la struct n’a pas changé (compatible au niveau des octets) donc les désérialiseurs existants continuent de fonctionner, mais après la suppression d’OpenBook les champs marqués DÉPRÉCIÉ ci-dessus ne sont plus écrits — les compteurs de volume swap_* sont gelés à leur dernière valeur. Pour l’analyse du volume, utilisez les journaux de trading plutôt que ces champs. Seuls need_take_pnl_* et pool_open_time sont activement maintenus.
Champs visibles pour les intégrateurs :
  • coin_vault, pc_vault — les vaults SPL Token du pool. coin est token_0 par convention Serum/OpenBook (base), pc est token_1 (quote).
  • coin_decimals, pc_decimals — correspondant aux mints.
  • open_orders, target_orders, market — champs de référence hérités. Toujours présents sur AmmInfo et toujours passés positionnellement sur les layouts d’instructions v1, mais le programme ne les lit ni ne les valide plus. Les points d’entrée de swap V2 les omettent.
  • fees.swap_fee_numerator / swap_fee_denominator — le frais de trading combiné. Par défaut 25 / 10_000 = 0.25%.
  • status — un unique état énuméré u64 qui contrôle les opérations, et non un masque de bits. Configurable par l’admin via SetParams avec param = 0 (Status). Voir Statut ci-dessous.
  • lp_amount — le total LP interne du pool. Il n’est pas égal à lp_mint.supply : il est exactement supérieur d’un token LP entier (10^coin_decimals unités de base), car ce montant est comptabilisé à l’initialisation mais jamais minté. Toute la mathématique au prorata utilise lp_amount, alors utilisez-le aussi.
  • amm_owner — écrit à la création depuis la clé admin codée en dur du programme, et non depuis celle du créateur.
  • state_data.need_take_pnl_* — delta entre les frais bruts accumulés et ce qui a été balayé. TakePnl remet ces valeurs à zéro.

Le câblage OpenBook

Supprimé. La dépendance OpenBook / Serum a été supprimée du programme (mise à jour 2026-07). Les comptes décrits dans cette section ne sont plus validés ou utilisés. Ils restent comme champs de référence sur AmmInfo et comme espaces réservés positionnels sur les layouts d’instructions v1 hérités. Utilisez les points d’entrée de swap V2 (SwapBaseInV2 / SwapBaseOutV2) qui ignorent entièrement ces comptes.
Lorsque vous appelez une instruction v1 hérité SwapBaseIn / SwapBaseOut, Deposit, ou Withdraw, le nombre de comptes doit toujours correspondre à l’ancien layout (les comptes de marché occupent leurs positions historiques), mais leur contenu n’est plus vérifié — aucun CPI n’est émis contre eux. Le nouveau code doit utiliser les variantes de swap V2, qui ne prennent pas du tout ces comptes.
Le amm_open_orders de l’AMM est un compte appartenant à OpenBook contenant l’état des ordres à cours limité du pool sur ce marché : ordres actifs, soldes réglés, parrains, etc. amm_target_orders est du côté AMM : il contient la grille prévue de l’AMM (prix/taille pour chaque emplacement d’ordre) afin que le programme puisse comparer à bas coût avec ce qui est actuellement affiché et placer / annuler la différence.

PDAs d’autorité

Il existe exactement un PDA amm_authority pour l’ensemble du programme AMM v4. Sa seed est triviale (["amm authority"]) et son bump est stocké sur chaque AmmInfo. Cette autorité signe tous les mouvements de tokens pour tous les pools AMM v4.
Il n’existe pas de seconde autorité au périmètre du pool : ce seul PDA couvre tout ce que le programme signe. Son bump est 254 sur mainnet et est reflété sur chaque AmmInfo sous le nom de nonce ; WithdrawExcessLamports le redérive avec ce nonce codé en dur.

Vaults

Les vaults SPL Token du pool sont des comptes de tokens standard dont le owner est amm_authority. Pas des ATAs — leurs adresses sont des PDAs dérivés à Initialize2 depuis [AMM_V4_PROGRAM_ID, market, "coin_vault_associated_seed"] et [AMM_V4_PROGRAM_ID, market, "pc_vault_associated_seed"]. Le mint n’est pas un seed, et amm_id non plus. Les adresses sont stockées sur AmmInfo ; la dérivation est une curiosité ponctuelle. Token-2022 n’est pas supporté. Le programme code en dur l’ID du programme SPL Token pour tous les mouvements de vault. Tenter de lier un pool AMM v4 à un mint Token-2022 échoue à Initialize2 avec InvalidSplTokenProgram.

LP mint

Un mint SPL Token classique dont l’autorité est amm_authority. L’offre totale suit la propriété LP du pool ; brûler des LP retourne les tokens des deux vaults au prorata. Il existe un miroir dans l’état : AmmInfo.lp_amount. Il n’est pas égal à l’offre du mint — il est exactement supérieur d’un token LP entier (10^coin_decimals unités de base), car ce montant est comptabilisé à l’initialisation mais jamais minté. Chaque calcul au prorata du programme divise par lp_amount, utilisez donc ce champ plutôt que l’offre on-chain du mint.

Statut

AmmInfo.status est un unique état énuméré u64, et non un masque de bits. Testez-le par égalité — un client qui teste status & 1 classe mal tous les pools actifs, car l’état de trading normal est 6, dont le bit 0 est positionné. Initialize2 écrit 7 quand open_time est dans le futur et 6 sinon ; un pool à 7 bascule lui-même à 6 lors du premier swap effectué à state_data.pool_open_time ou après. Une valeur en dehors de 0..=7 fait paniquer AmmStatus::from_u64. Le multisig Raydium définit l’état via SetParams avec param = 0 (Status) ; seules les valeurs 1–7 sont acceptées. (AdminCancelOrders a été supprimé.)

Observation / oracle

AMM v4 n’a pas de compte d’observation dédié, et depuis la suppression d’OpenBook il n’y a plus non plus d’état de carnet d’ordres pour en dériver un. Si vous avez besoin d’un TWAP Raydium avec support du programme, utilisez CPMM ou CLMM — les deux maintiennent un buffer en anneau ObservationState. Sinon, indexez les logs de swap hors chaîne.

Dériver les comptes d’un pool à partir de zéro

Les comptes de pool d’AMM v4 sont de simples PDAs indexés sur le marché lié — ni des keypairs avec seed, ni des PDAs par paire. Chacun d’eux utilise la même forme à trois seeds [AMM_V4_PROGRAM_ID, market, <label>] sous AMM_V4_PROGRAM_ID :
Le marché lié est le seul seed variable, c’est pourquoi un marché correspond à exactement un pool AMM v4. Le SDK et l’API les pré-calculent pour vous ; voir raydium-sdk-v2’s Liquidity.getAssociatedPoolKeys. En pratique, les intégrateurs lisent l’ensemble complet des comptes du pool depuis GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> ou depuis le SDK. La dérivation manuelle est rarement nécessaire.

Référence rapide du cycle de vie

Les pools et leurs comptes persistent indéfiniment. Même si la liquidité est entièrement retirée, AmmInfo reste.

Où lire quoi

Sources :