Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Une entrée du journal des modifications de la documentation. Pour l’index de toutes les mises à jour, consultez reference/changelog. Pour la chronologie historique du protocole, consultez introduction/history-and-milestones.
Cette version documente deux changements du programme CLMM. Les deux sont additifs et rétro-compatibles : les pools, positions et ordres ouverts existants ne sont pas affectés, et les chemins classiques CreatePool / CreateCustomizablePool restent inchangés.

TL;DR pour les intégrateurs

  • Les ID de pool peuvent désormais être non-canoniques, derrière une porte de permission. Historiquement, il y avait exactement une adresse de pool CLMM par (amm_config, token_mint_0, token_mint_1) — les seeds du PDA la fixaient. Une nouvelle instruction, CreatePermissionedPool, intègre un seed_index: u16 non-nul fourni par le client dans les seeds du PDA du pool, permettant à un opérateur sur liste blanche de créer plusieurs pools pour la même paire et le même tier de frais, chacun à sa propre adresse. Puisque les adresses de pool arbitraires sont une capacité privilégiée, le payeur doit détenir un PDA Permission accordé par l’administrateur. Deux instructions administrateur, CreatePermissionPda et ClosePermissionPda, gèrent ces autorisations.
  • OpenLimitOrder valide désormais le côté output. L’instruction accepte trois comptes supplémentaires — output_token_account, output_vault, output_vault_mint — et rejette l’ordre avec NotApproved si le compte de token input ou output du propriétaire est gelé. Cela garantit que le remplissage éventuel peut être livré, ce qui importe pour les mints Token-2022 avec liste d’autorisation / gelés par défaut (tokens permissionnés). Les clients construits contre l’ancienne liste de comptes unilatérale doivent ajouter les trois comptes output.

Ce qui a changé dans le programme

Nouvelle instruction : CreatePermissionedPool

Même forme et paramètres que CreateCustomizablePool (elle accepte les mêmes CreateCustomizableParams, donc les frais unilatéraux et l’opt-in de frais dynamiques sont disponibles), plus :
  • Un argument seed_index: u16, qui doit être non-nul. Il est ajouté (little-endian) aux seeds du PDA du pool : ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()].
  • Un compte permission : le PDA ["permission", payer]. Anchor rejette l’appel s’il n’existe pas ou n’est pas possédé par le programme — sa simple existence est l’autorisation.
  • Un compte pool_creator enregistré comme pool_state.owner, qui peut différer du payer payant les frais.
seed_index = 0 reste réservé aux pools hérités : pour ceux-ci, la composante seed s’effondre à vide, reproduisant l’adresse classique à quatre seeds, donc aucune adresse de pool existante ne change. Consultez Instructions → CreatePermissionedPool.

Nouveau compte : Permission

Un compte de capacité dont l’existence est l’autorisation. Il stocke uniquement l’authority pour laquelle il a été créé (plus du remplissage). Seeds du PDA : ["permission", authority]. Il confère le droit d’appeler CreatePermissionedPool et rien d’autre — il ne peut pas déplacer des fonds, modifier les frais ou muter un pool. Consultez Accounts → Permission.

Nouvelles instructions administrateur : CreatePermissionPda / ClosePermissionPda

  • CreatePermissionPda initialise un PDA Permission pour une permission_authority donnée.
  • ClosePermissionPda le ferme et rembourse le loyer à l’appelant, révoquant l’autorisation. Les pools déjà créés sous cette autorisation ne sont pas affectés.
Les deux acceptent soit la clé admin du programme soit une clé permission_pda_admin dédiée (une constante distincte sur mainnet par rapport à devnet). Consultez Admin keys and multisig → CLMM.

PoolState : champ seed_index

Deux octets ont été extraits d’une région de remplissage existante (padding: [u8; 6]seed_index: [u8; 2] + padding: [u8; 4]) directement après fee_on. La taille totale du compte est inchangée, et aucune migration d’indexeur n’est requise. Pour les pools créés via CreatePool / CreateCustomizablePool, seed_index est [0, 0] ; pour les pools permissionnés, il porte l’index choisi par le créateur et est requis pour re-dériver l’adresse du pool hors-chaîne.

OpenLimitOrder : comptes du côté output et garde de compte gelé

La liste de comptes OpenLimitOrder gagne output_token_account, output_vault et output_vault_mint. Ils sont utilisés uniquement pour la validation — aucun output n’est débité à l’ouverture. Le gestionnaire exige désormais que ni le compte de token input ni le compte de token output ne soit gelé, retournant NotApproved sinon (le même code déjà retourné quand le pool a le swap ou l’ordre limite désactivé). Cela ferme une lacune où un ordre pouvait être ouvert contre un compte de token qui ne pouvait jamais recevoir le remplissage (par exemple, un compte pas encore dégelé pour un mint Token-2022 gelé par défaut). Consultez Instructions → OpenLimitOrder.

Codes d’erreur

Aucun nouveau code d’erreur. Le code 6000 NotApproved existant couvre désormais également le compte de token input/output gelé et les cas swap/limit-order-disabled sur OpenLimitOrder, et le cas « le signataire n’est ni admin ni permission_pda_admin » sur les instructions de permission. Le tableau des codes d’erreur et la numérotation sont autrement inchangés par rapport à la version du 2026-05-18. Consultez Error codes → CLMM.

Notes de migration

  • Lecture des adresses de pool : ne supposez pas un pool par (config, mint0, mint1). Une paire peut désormais avoir un pool canonique plus un ou plusieurs pools permissionnés à des adresses dérivées de seed_index. Énumérez les pools à partir de l’API / indexeur plutôt que de dériver un seul PDA, et stockez seed_index quand vous avez besoin de re-dériver un pool permissionnée.
  • Placement d’ordres limites : ajoutez les trois comptes du côté output à votre transaction OpenLimitOrder, et affichez un message clair quand NotApproved est retourné pour un compte gelé.
  • Aucune rupture de taille de compte ou de disposition : PoolState a la même taille ; les octets de remplissage retraités contiennent désormais seed_index.

Pages mises à jour

  • products/clmm/overview — note « What’s new » sur les pools multi-permissionnés et la garde d’ordre limite.
  • products/clmm/instructions — nouvelle section CreatePermissionedPool, CreatePermissionPda / ClosePermissionPda dans le tableau des instructions et la note de gating administrateur, et la liste de comptes / préconditions / erreurs OpenLimitOrder mise à jour.
  • products/clmm/accountsPermission dans l’inventaire et sa propre section, le champ PoolState.seed_index, les aides de dérivation PDA (derivePermissionedPool, derivePermission), et la référence rapide du cycle de vie.
  • security/admin-and-multisig — nouvelle ligne permission_pda_admin et expliquant la portée de permission dans le tableau des rôles CLMM.
  • reference/error-codes — description NotApproved élargie.
Vérifié par rapport à :
  • source raydium-clmm (create_permissioned_pool.rs, admin/create_permission_pda.rs, admin/close_permission_pda.rs, states/permission.rs, states/pool.rs, limit_order/open_limit_order.rs, lib.rs).