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 →
El ID del programa y las semillas de PDA para CPMM se enumeran canónicamente en
reference/program-addresses. Esta página se enfoca en para qué sirve cada cuenta y los invariantes que mantiene, no en las direcciones codificadas.Las seis cuentas de un pool CPMM
Cada pool CPMM se describe completamente mediante seis direcciones derivadas del programa (PDAs) bajo el programa CPMM, más una cuentaAmmConfig compartida a la que hace referencia. Una vez que tienes los dos mints, puedes derivar todo de forma determinista sin tocar la red.
Y la configuración compartida:
Y una cuenta opcional por creador:
Derivar un pool de nada más que dos mints
El ID del pool no siempre es el PDA canónico.
Initialize acepta un keypair firmante arbitrario como pool_state además del PDA anterior. Si la cuenta pasada no coincide con el PDA canónico, el programa requiere que sea un firmante — es decir, el creador pasa un keypair nuevo que firma. Esta es la defensa contra front-running: cualquier tercero que corra para agarrar el PDA canónico puede ser evitado por el creador legítimo usando un keypair aleatorio en su lugar. Los PDAs posteriores (lpMint, vault0, vault1, observation) aún se derivan de poolState.key(), por lo que permanecen únicos a cualquier dirección que se haya usado. Cuando indexas pools, siempre descubre el ID del pool desde el estado en la cadena (por ejemplo, cuentas PoolState bajo el programa CPMM), no derivando el PDA canónico — este último perderá pools con keypair aleatorio.Diseños de cuenta
Las definiciones completas de Rust viven en la fuenteraydium-cp-swap. Los campos a continuación son los que leerás de una integración.
PoolState
lp_supply— el total de LP interno del pool. No es igual al suministro del mint de LP: es exactamente 100 unidades base más alto, porque las 100 unidades bloqueadas se cuentan aquí pero nunca se acuñan. Toda la matemática de participación de LP (depósito, retiro) divide porlp_supply, así que usa este campo y no sustituyas el suministro en la cadena del mint.protocol_fees_token{0,1},fund_fees_token{0,1}— comisiones acumuladas aún no barridas. Estas no afectan el precio del swap; se sientan en las bóvedas hasta que se llamaCollectProtocolFee/CollectFundFee.protocol_fees_token{0,1}también recibe la participación del protocolo de la comisión del creador cuando se recopila una comisión del creador, por lo que crece fuera de los swaps — verproducts/cpmm/fees.status— una máscara de bits que controla siSwap,Deposit,Withdrawestán permitidos. Actualizado por el administrador a través deUpdatePoolStatus. El SDK verifica esto antes de construir una transacción; si estás haciendo CPI directamente, verifica tú mismo.token0_program/token1_program— el programa de token en el que hacer CPI para cada bóveda. Uno puede ser SPL Token clásico y el otro Token-2022; son independientes.open_time— una marca de tiempo Unix. Los swaps antes de esta hora fallan. Los depósitos se permiten antes deopen_timepara que el pool pueda ser sembrado.creator_fee_on/enable_creator_fee— juntos controlan si la comisión de creador opcional está activa para este pool y de qué lado del swap se recopila.enable_creator_fee == falseanula completamente la ruta de comisión del creador. Cuando está habilitado,creator_fee_onselecciona:0= tomar comisión de cualquier token que sea la entrada del swap (BothToken);1= tomar comisión detoken_0solo (omitir en swapstoken_1 → token_0);2= tomar comisión detoken_1solo. Se establece en la creación del pool a través deInitializeWithPermission; no puede cambiar después.creator_fees_token_{0,1}— comisiones de creador acumuladas, barridas porCollectCreatorFeeoCollectCreatorFeePermissionless. Ambas rutas cero los contadores completos, pero desde la actualización de participación de comisión de creador del 2026-09-19 solo parte del saldo sale del pool: la participación del protocolo se agrega aprotocol_fees_token_{0,1}y el resto se transfiere al creador. La ruta sin permiso fija los destinatarios a los ATAs canónicos depool_creator.PoolStateen sí no cambió — no hay un contador separado para la cantidad compartida.
AmmConfig
trade_fee_rateycreator_fee_rateson fracciones del volumen, ambas denominadas en unidades de1/1_000_000.2500significa 0.25% del volumen de comercio.protocol_fee_rateyfund_fee_rateson fracciones de la comisión de comercio (no del volumen), en el mismo denominador1/1_000_000. La comisión del creador no es una fracción de la comisión de comercio — es su propia tasa independiente. La aritmética completa está enproducts/cpmm/fees.indexes unu16, así que el hash de semilla usa 2 bytes big-endian. Un error de uno en el orden de bytes es un error de integración común.AmmConfiges inmutable a nivel de pool. Un pool apunta a unAmmConfigen la creación y nunca cambia. Los cambios de comisión se propagan porque el pool lee la configuración en cada swap — pero el pool no puede moverse entre niveles de comisión.
creator_fee_rate) vive en AmmConfig y se comparte entre el nivel de comisión. Si un pool en particular realmente la cobra (enable_creator_fee) y de qué lado del swap cae (creator_fee_on) viven en PoolState. La comisión del creador es independiente de la comisión de comercio — es su propia tasa, acumulada a sus propios contadores (creator_fees_token_{0,1}), y nunca reduce las participaciones de LP / protocolo / fondo de la comisión de comercio. El barrido es a través de CollectCreatorFee o el CollectCreatorFeePermissionless restringido por destino, y ambas rutas entregan una participación del saldo acumulado al protocolo en el camino — a creator_fee_share_rate, o a la tasa en un PDA CreatorFeeShare cuando existe uno para ese par (creator, amm_config). Ver products/cpmm/fees para la mecánica completa.
Permission
Una pequeña cuenta de control de acceso utilizada por InitializeWithPermission. El programa CPMM admite una ruta de creación de pool con permiso para que otros programas (por ejemplo, LaunchLab cuando gradúa un token a CPMM) puedan probar que tienen derecho a crear un pool contra un AmmConfig dado.
CreatePermissionPda por el administrador de CPMM o una autoridad de creador de PDA de permiso dedicada. Desde la actualización de 2026-09, ClosePermissionPda acepta los mismos dos firmantes; antes era solo administrador. Los usuarios finales no interactúan directamente con esta cuenta — es plomería para flujos entre programas. Ver security/admin-and-multisig para el límite de rol y reference/program-addresses para direcciones canónicas.
CreatorFeeShare
Una cuenta opcional que anula la participación del protocolo en la comisión del creador para un par (creador de pool, AmmConfig). Agregado por la actualización de participación de comisión de creador del 2026-09-19.
- Es opcional, pero la cuenta nunca es opcional en la instrucción.
CollectCreatorFeeyCollectCreatorFeePermissionlessambas declarancreator_fee_sharecon la restricción de semilla anterior y la toman en cada llamada. El programa luego verifica si la cuenta está vacía o es propiedad extranjera; si es así, vuelve aAmmConfig.creator_fee_share_rate. Así que un cliente siempre debe derivar y pasar la dirección, exista o no la cuenta. share_rateestá limitado aFEE_RATE_DENOMINATOR_VALUE(1_000_000) en la creación, y nuevamente cuando se ejecuta la división.1_000_000enruta toda la comisión del creador al protocolo;0no enruta nada.- Creado y cerrado por el administrador o una autoridad dedicada a través de
CreateCreatorFeeShare/CloseCreatorFeeShare. Cerrarlo devuelve la renta al firmante y hace que el par vuelva al valor predeterminado de la configuración; el creador del pool no es un firmante en ninguna ruta. - Se basa en el creador, no en el pool. Una cuenta rige cada pool que ese creador tiene en ese
AmmConfig. Un creador con pools en dos niveles de comisión necesita dos cuentas para estar cubierto en ambos.
products/cpmm/fees.
Bóvedas y Token-2022
vault0 y vault1 son propiedad del PDA de autoridad de CPMM, y su propietario de programa de token (token_program) es SPL Token o Token-2022, determinado en la creación del pool por el programa del mint. El pool maneja los dos casos de forma transparente — pasas el ID de programa de token correcto para cada lado en las cuentas de instrucción Swap / Deposit / Withdraw.
CPMM aplica una lista de permitidos de extensión estricta en la creación del pool (is_supported_mint en utils/token.rs). Un mint de Token-2022 puede usarse en un pool CPMM solo si cada extensión que lleva está en esta lista:
TransferFeeConfig. Aplicado por el mint en cada transferencia. El pool está en el lado receptor para depósitos deSwapBaseInputy en el lado de envío para retiros. El programa calcula la cantidad neta que llega a la bóveda y establece la curva en consecuencia. Veralgorithms/token-2022-transfer-fees.MetadataPointeryTokenMetadata. Metadatos estándar en mint. Sin efecto en la matemática del swap.InterestBearingConfig. La cantidad de UI del mint acumula interés. La bóveda almacena cantidades brutas; la curva opera solo en cantidades brutas. Las UIs que muestran APR deben llamar a los ayudantes de Token-2022 para renderizar la cantidad de UI.ScaledUiAmount. Extensión de escalado de visualización de UI. El mismo tratamiento queInterestBearingConfig— la curva usa cantidades brutas.
PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority, etc. — causa que Initialize rechace con NotSupportMint. La única excepción es un registro por mint: si existe un PDA SupportMintAssociated en la semilla [b"support_mint", mint], el mint se admite independientemente de su conjunto de extensiones. Ese PDA es creado y removido por el administrador (o una autoridad de soporte de mint dedicada) a través de CreateSupportMintAssociated / CloseSupportMintAssociated, por lo que incorporar un mint específico ya no necesita una actualización del programa.
Cambió en 2026-09. CPMM anteriormente también llevaba una
MINT_WHITELIST de cuatro direcciones codificadas que cortocircuitaba la verificación de extensión. Ese array fue removido; el PDA del registro es ahora el único bypass. Cualquier mint que estuviera confiando en la lista codificada necesita un PDA SupportMintAssociated antes de que se pueda crear un nuevo pool para él — los pools existentes no se ven afectados, porque la verificación se ejecuta solo en la creación del pool.programs/cp-swap/src/utils/token.rs y puede cambiar con futuras actualizaciones del programa. Ver reference/token-2022-support para la matriz entre programas.
Observation
La cuenta de observación es un búfer de anillo de entradasObservationState, cada una almacenando un block_timestamp y un precio acumulativo. En cada swap el programa añade una nueva observación si ha pasado suficiente tiempo desde la última. Los TWAPs se calculan leyendo dos observaciones y dividiendo Δcumulative / Δtime.
8 + 16 + 16), así que el array solo es 4,000 bytes; ObservationState::LEN es exactamente 4,075 bytes (8 + 1 + 2 + 32 + 4,000 + 8 × 4).
Dos reglas de consumidor:
- No uses una sola observación como precio. Es un acumulativo, no un precio spot. Usa dos de ellas para calcular un TWAP.
- Elige observaciones al menos un bloque aparte. Los swaps dentro del mismo bloque pueden no producir una nueva observación; leer de forma consecutiva puede devolver el mismo registro.
products/clmm/accounts.
Ciclo de vida de la cuenta
Los pools CPMM y sus PDAs nunca se cierran.
Permission, SupportMintAssociated y CreatorFeeShare son las excepciones — son registros independientes administrados por el administrador, no estado del pool, y cada uno tiene una instrucción de cierre explícita. Incluso con liquidez cero el poolState permanece. Esto es deliberado: resembrar el mismo pool más tarde preserva su búfer de observación histórico y su derivación de PDA permanece estable.
Qué leer dónde
- Listas de cuentas de instrucción (cuál de las anteriores es escribible/firmante para cada instrucción):
products/cpmm/instructions. - Semántica de acumulación de comisiones:
products/cpmm/fees. - Matemática de swap / regla de actualización de observación:
products/cpmm/math. - Semillas canónicas / IDs de programa:
reference/program-addresses.

