Saltar al contenido principal
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 →
Reemplazado el 2026-10-22. CreatePermissionedPool fue renombrado a CreateCustomizablePoolV2 y se hizo sin permisos, y la cuenta Permission con CreatePermissionPda / ClosePermissionPda fue eliminada. Esta entrada describe el programa tal como estaba el 2026-07-30. Consulta la entrada del 2026-10-22.
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.

Resumen ejecutivo 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 cero 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 Permission PDA 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 permisionados). 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

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 la componente de semilla se colapsa a vacía, 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 a 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 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

Dos bytes fueron extraídos 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 vía CreatePool / CreateCustomizablePool, seed_index es [0, 0]; para pools permisionados 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 orden limitada deshabilitados). 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 6000 NotApproved existente ahora cubre adicionalmente la cuenta de token de entrada/salida congelada y los casos de swap/orden-limitada-deshabilitada 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 de otro modo sin cambios desde la versión del 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 permisionados 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 permisionado.
  • 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 permisionados multi y la protección de orden limitada.
  • products/clmm/instructions — nueva sección CreatePermissionedPool, CreatePermissionPda / ClosePermissionPda en la tabla de instrucciones y nota de control de administrador, y la lista de cuentas / precondiciones / errores actualizada de OpenLimitOrder.
  • products/clmm/accounts — Permission 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 CLMM.
  • reference/error-codes — descripción ampliada de NotApproved.
Verificado contra:
  • Fuente 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).