Skip to main content
Esta página fue traducida automáticamente por IA. La versión en inglés es la fuente autorizada.Ver versión en inglés →
Esta versión documenta dos cambios en el programa CLMM. Ambos son aditivos y compatibles hacia atrás: los pools, posiciones y órdenes abiertas existentes no se ven afectados, y las rutas clásicas CreatePool / CreateCustomizablePool permanecen sin cambios.

TL;DR para integradores

  • Los IDs de pool ahora pueden ser no canónicos, detrás de una puerta de permisos. Históricamente había exactamente una dirección de pool CLMM por (amm_config, token_mint_0, token_mint_1) — las semillas del PDA la fijaban. Una nueva instrucción, CreatePermissionedPool, integra un seed_index: u16 no nulo suministrado por el cliente en las semillas del PDA del pool, para que un operador en lista blanca pueda crear varios pools para el mismo par y nivel de comisión, cada uno en su propia dirección. Dado que las direcciones de pool arbitrarias son una capacidad privilegiada, el pagador debe tener un PDA de Permission otorgado por el administrador. Dos instrucciones de administrador, CreatePermissionPda y ClosePermissionPda, gestionan esos permisos.
  • OpenLimitOrder ahora valida el lado de salida. La instrucción toma tres cuentas adicionales — output_token_account, output_vault, output_vault_mint — y rechaza la orden con NotApproved si la cuenta de token de entrada o salida del propietario está congelada. Esto garantiza que el llenado eventual pueda entregarse, lo que importa para mints Token-2022 con lista de permisos / congelados por defecto (tokens con permisos). Los clientes compilados contra la lista de cuentas antigua de un solo lado deben agregar las tres cuentas de salida.

Qué cambió en el programa

Nueva instrucción: CreatePermissionedPool

Tiene la misma forma y parámetros que CreateCustomizablePool (toma los mismos CreateCustomizableParams, por lo que la comisión de un solo lado y la opción de comisión dinámica están disponibles), más:
  • Un argumento seed_index: u16, que debe ser distinto de cero. Se añade (little-endian) a las semillas del PDA del pool: ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()].
  • Una cuenta permission: el PDA ["permission", payer]. Anchor rechaza la llamada si no existe o no es propiedad del programa — su mera existencia es la autorización.
  • Una cuenta pool_creator registrada como pool_state.owner, que puede diferir del payer que paga la comisión.
seed_index = 0 permanece reservado para pools heredados: para esos, el componente de semilla se colapsa a vacío, reproduciendo la dirección clásica de cuatro semillas, por lo que ninguna dirección de pool existente cambia. Consulta Instructions → CreatePermissionedPool.

Nueva cuenta: Permission

Una cuenta de capacidad cuya existencia es el permiso. Solo almacena la authority para la que fue creada (más relleno). Semillas del PDA: ["permission", authority]. Confiere el derecho de llamar a CreatePermissionedPool y nada más — no puede mover fondos, cambiar comisiones o mutar ningún pool. Consulta Accounts → Permission.

Nuevas instrucciones de administrador: CreatePermissionPda / ClosePermissionPda

  • CreatePermissionPda inicializa un PDA de Permission para una permission_authority dada.
  • ClosePermissionPda lo cierra y reembolsa la renta al llamador, revocando el permiso. Los pools ya creados bajo ese permiso no se ven afectados.
Ambas aceptan la clave admin del programa o una clave dedicada permission_pda_admin (una constante distinta en mainnet vs devnet). Consulta Admin keys and multisig → CLMM.

PoolState: campo seed_index

Se tallaron dos bytes de una región de relleno existente (padding: [u8; 6]seed_index: [u8; 2] + padding: [u8; 4]) directamente después de fee_on. El tamaño total de la cuenta no cambia, y no se requiere migración de indexador. Para pools creados mediante CreatePool / CreateCustomizablePool, seed_index es [0, 0]; para pools con permisos lleva el índice elegido por el creador y es necesario para re-derivar la dirección del pool fuera de cadena.

OpenLimitOrder: cuentas del lado de salida y protección de cuenta congelada

La lista de cuentas de OpenLimitOrder gana output_token_account, output_vault y output_vault_mint. Se utilizan solo para validación — no se debita salida al abrir. El manejador ahora requiere que ninguna de las cuentas de token de entrada o salida esté congelada, devolviendo NotApproved en caso contrario (el mismo código ya devuelto cuando el pool tiene swap u órdenes limitadas deshabilitadas). Esto cierra una brecha donde una orden podría abrirse contra una cuenta de token que nunca podría recibir el llenado (por ejemplo, una cuenta aún no descongelada para un mint Token-2022 congelado por defecto). Consulta Instructions → OpenLimitOrder.

Códigos de error

Sin nuevos códigos de error. El código existente 6000 NotApproved ahora cubre además la cuenta de token de entrada/salida congelada y los casos de swap/órdenes limitadas deshabilitadas en OpenLimitOrder, y el caso “el firmante no es ni admin ni permission_pda_admin” en las instrucciones de permisos. La tabla de códigos de error y la numeración son iguales a las de la versión 2026-05-18. Consulta Error codes → CLMM.

Notas de migración

  • Lectura de direcciones de pool: no asumas un pool por (config, mint0, mint1). Un par ahora puede tener un pool canónico más uno o más pools con permisos en direcciones derivadas de seed_index. Enumera pools desde la API / indexador en lugar de derivar un único PDA, y almacena seed_index cuando necesites re-derivar un pool con permisos.
  • Colocación de órdenes limitadas: agrega las tres cuentas del lado de salida a tu transacción OpenLimitOrder, y muestra un mensaje claro cuando se devuelve NotApproved para una cuenta congelada.
  • Sin ruptura de tamaño de cuenta o diseño: PoolState tiene el mismo tamaño; los bytes de relleno retirados ahora contienen seed_index.

Páginas actualizadas

  • products/clmm/overview — nota “What’s new” sobre pools multi con permisos y la protección de órdenes limitadas.
  • products/clmm/instructions — nueva sección CreatePermissionedPool, CreatePermissionPda / ClosePermissionPda en la tabla de instrucciones y nota de puerta de administrador, y la lista de cuentas / precondiciones / errores actualizada de OpenLimitOrder.
  • products/clmm/accountsPermission en el inventario y su propia sección, el campo PoolState.seed_index, ayudantes de derivación de PDA (derivePermissionedPool, derivePermission), y la referencia rápida del ciclo de vida.
  • security/admin-and-multisig — nueva fila permission_pda_admin y explicador de alcance de permisos en la tabla de roles de CLMM.
  • reference/error-codes — descripción ampliada de NotApproved.
Verificado contra:
  • Fuente de 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).