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 página complementa
products/clmm/accounts (descripción de las cuentas) y products/clmm/math (explicación de la matemática). Es la referencia definitiva para argumentos y orden de cuentas; los layouts de bytes provienen del IDL.Inventario de instrucciones
La mayoría de las instrucciones solo para admins (
CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateSupportMintAssociated, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) están protegidas por la clave pública admin codificada en el programa. Las instrucciones de admin de flujos de recompensas (TransferRewardOwner, CollectRemainingRewards) están protegidas por el financiador de la recompensa, no por el admin del programa.
El sufijo V2 significa “admite Token-2022 en vaults / NFT, requiere la ranura de extensión bitmap”. El SDK usa V2 por defecto para nuevos pools.
CreatePool
Argumentos
Precondiciones
token_mint_0 < token_mint_1por orden de bytes.amm_config.disable_create_pool == false.- Los mints no están rechazados por la lista de permitidos de extensiones Token-2022.
pool_state.sqrt_price_x64 = sqrt_price_x64,tick_current = floor(log_{1.0001}(price)).pool_state.liquidity = 0(sin posiciones todavía).pool_state.fee_on = FromInput(valor predeterminado heredado).pool_state.dynamic_fee_infose inicializa en cero (comisión dinámica desactivada).
CreateCustomizablePool
Recomendado para nuevos pools. Tiene el mismo efecto que CreatePool más el modo de cobro de comisiones por pool y una activación opcional de comisión dinámica.
Argumentos
CreatePool más, cuando enable_dynamic_fee = true:
Precondiciones — iguales a
CreatePool. Si enable_dynamic_fee = false, dynamic_fee_config se ignora.
Postcondiciones
pool_state.fee_onse establece según la varianteCollectFeeOnelegida.- Si se activó la comisión dinámica:
pool_state.dynamic_fee_infose inicializa desde elDynamicFeeConfigproporcionado (se copian los cinco parámetros de calibración; los campos de estado se ponen a cero). - De lo contrario:
pool_state.dynamic_fee_infose pone a cero (= comisión dinámica inactiva permanentemente para este pool).
fee_on y el bit de activación de comisión dinámica se establecen únicamente en la creación del pool. No existe una actualización en el lugar: los pools creados con el CreatePool heredado no pueden obtener retroactivamente comisión dinámica ni comisión unilateral. Los nuevos despliegues deben usar esta instrucción por defecto.
OpenPositionV2 / OpenPositionWithToken22Nft
Crea una nueva posición dentro de un pool existente.
Argumentos
Matemática — ver
products/clmm/math. Dado base_flag, el programa resuelve liquidity o (amount_0_max, amount_1_max) para obtener el L real y los amounts de tokens consumidos.
Precondiciones
tick_lower < tick_upper, ambos múltiplos depool.tick_spacing, dentro de[MIN_TICK, MAX_TICK].- Los tick arrays requeridos se pasan y están inicializados (o se crean aquí vía CPI
InitTickArrayen la transacción). - El usuario tiene al menos
amount_0_maxyamount_1_maxen las ATAs de origen.
personal_positionexiste,liquidityestablecido,fee_growth_inside_lastregistrado como instantánea.- Las entradas del tick array en
tick_lowerytick_upperse actualizan (liquidity_gross += L,liquidity_net ± L, instantáneas de crecimiento de comisiones mantenidas). pool_state.liquidity += Lsi la posición está en rango (tick_lower ≤ tick_current < tick_upper).
InvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (si hay demasiados tick arrays).
IncreaseLiquidityV2
Agrega liquidez a una posición ya abierta.
Argumentos
OpenPosition sin el mint del NFT (la posición ya existe; el NFT se pasa como la ATA del dueño que contiene 1 token).
Efecto
- Transfiere
amount_0_actual/amount_1_actualdel usuario a los vaults. - Incrementa
personal_position.liquidityypool_state.liquidity(si está en rango), así comoliquidity_gross/liquidity_netde los ticks extremos. - Cobra las comisiones y recompensas pendientes desde el último toque y las acredita en
tokens_fees_owed_{0,1}/reward_amount_owed. Estos montos solo se pagan enDecreaseLiquidityoCollectReward, no al incrementar.
DecreaseLiquidityV2
Retira liquidez de una posición.
Argumentos
IncreaseLiquidity.
Efecto
- Calcula
(amount_0, amount_1)para elLretirado dado elsqrt_price_x64actual. - Liquida las comisiones y recompensas acumuladas desde el último toque, igual que
IncreaseLiquidity. - Transfiere
amount_0 + fees_owed_0yamount_1 + fees_owed_1de los vaults al usuario. - Decrementa los contadores de liquidez; si el nuevo
personal_position.liquidity == 0, la posición es elegible paraClosePosition.
amount_0_min y amount_1_min son los mínimos que el usuario acepta neto de las comisiones de transferencia Token-2022 en el lado de salida.
ClosePosition
Quema el NFT de posición y cierra PersonalPositionState.
Precondiciones
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Todos los contadores de recompensas
reward_amount_owed == 0.
- Quema el NFT.
- Cierra la cuenta del mint del NFT y la cuenta
personal_position, devolviendo el alquiler alpayer.
SwapV2
Recorre la curva de liquidez; entrada exacta o salida exacta según is_base_input.
Argumentos
Los callers pasan una lista ordenada de tick arrays que cubren el recorrido esperado del swap; el programa usa los que necesite. El SDK calcula esta lista mediante
PoolUtils.computeAmountOutFormat o el endpoint de cotización de la API.
Precondiciones
pool_state.statuspermite el swap.now >= open_time.sqrt_price_limit_x64está en el lado correcto desqrt_price_x64según la dirección.
ExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient.
Lo que SwapV2 hace internamente y que los callers deben saber (versión post-2025):
- Recargo por comisión dinámica — si
pool.dynamic_fee_infoes distinto de cero, el programa actualiza el acumulador de volatilidad usando la distancia en ticks recorrida desde el último swap (con las reglas de filtrado/decaimiento deproducts/clmm/fees) y suma undynamic_fee_componentsobreAmmConfig.trade_fee_rate. La comisión total está limitada al 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000). - Coincidencia de órdenes límite — cuando el recorrido de precio cruza un tick que tiene órdenes límite abiertas, el programa primero completa la liquidez de las órdenes límite disponibles en ese tick (FIFO por
order_phase) y luego continúa por la curva de liquidez LP. Los amounts ejecutados actualizantick.unfilled_ratio_x64ytick.part_filled_orders_remainingpara liquidación posterior; las órdenes permanecen sin pagar hasta que su dueño llame aSettleLimitOrder. - Enrutamiento de comisión unilateral — cuando
pool.fee_on = Token0OnlyoToken1Only, el paso del swap calcula el mismo intercambio entrada-salida; la comisión se enruta luego al lado configurado. En las direcciones donde el lado de comisión configurado es la salida, la comisión se deduce del output del swap (el usuario recibeout − fee); en las direcciones donde es la entrada, el comportamiento coincide conFromInput. Veris_fee_on_input(zero_for_one)yis_fee_on_token0(zero_for_one)enPoolState.
Swap (V1) implementa la misma comisión dinámica, enrutamiento de comisión unilateral y coincidencia de órdenes límite que SwapV2; la única característica que le falta es el soporte de Token-2022: ambos vaults deben ser SPL Token clásico. Los pools con cualquier mint Token-2022 deben operarse vía SwapV2. El agregador y el SDK ya prefieren V2 para cada tramo CLMM, por lo que los callers no necesitan ramificar según el tipo de mint.
OpenLimitOrder
Coloca una orden de venta en un tick específico. La orden se sitúa en una cola FIFO por tick y se ejecuta a medida que el precio la atraviesa.
Argumentos
Precondiciones
tick_index % pool.tick_spacing == 0y dentro de[MIN_TICK, MAX_TICK].tick_indexestá en el lado correcto depool.tick_currentpara la dirección elegida (al vender token0 → el tick debe estar por encima del actual, y viceversa). Vender en un tick ya cruzado se ejecutaría de inmediato y es rechazado.pool_state.statuspermite la operación de orden límite (bit 5).
limit_orderexiste, registrandotick.order_phaseytick.unfilled_ratio_x64al momento de apertura.tick.orders_amount += amount(en la cohorte actual).limit_order_nonce.order_nonce += 1.- Se emite
OpenLimitOrderEvent.
InvalidLimitOrderAmount (cero o por debajo del mínimo del pool), InvalidTickIndex (fuera de [MIN_TICK, MAX_TICK], o en el lado incorrecto de tick_current para la dirección elegida), TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0), OrderPhaseSaturated.
IncreaseLimitOrder
Agrega monto a una orden abierta existente. Solo puede ser llamado por el owner de la orden.
Argumentos
OpenLimitOrder sin la cuenta nonce; la PDA limit_order se pasa directamente.
Precondiciones
limit_order.owner == signer.- La orden sigue en la misma cohorte (
tick.order_phase == limit_order.order_phase). Si la cohorte ya comenzó a ejecutarse, la orden está parcialmente liquidada: el caller debería llamar primero aDecreaseLimitOrderoSettleLimitOrderpara avanzar.
- Transfiere
amountdesde la ATA del dueño alinput_vault. limit_order.total_amount += amount;tick.orders_amount += amount.
DecreaseLimitOrder
Reduce o cancela completamente una orden abierta. Devuelve el remanente sin ejecutar al dueño, más cualquier output ya liquidado por ejecuciones parciales anteriores.
Argumentos
Efecto
- Recalcula el amount ejecutado de la orden a partir del
unfilled_ratio_x64de la cohorte desde la apertura. - Envía el output ejecutado a
output_token_account. - Devuelve
amountde la entrada sin ejecutar ainput_token_account. - Actualiza
limit_orderen consecuencia. Si el nuevo remanente sin ejecutar es cero, el programa cierra la cuenta y devuelve el alquiler alowner.
SettleLimitOrder
Envía los tokens de output ejecutados al dueño sin cambiar el remanente sin ejecutar de la orden. Útil cuando los keepers de auto_withdraw quieren pagar de forma gradual ejecuciones parciales prolongadas.
Caller — el owner de la orden o el limit_order_admin del programa (una billetera caliente operacional fuera de la cadena que ejecuta un bucle de keeper automatizado). El keeper no tiene otra autoridad: no puede mover fondos del usuario más allá de enviar el output ejecutado a la ATA del owner de la orden.
Cuentas
Efecto
- Calcula el output acumulado adeudado usando
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64). - Transfiere el delta a
output_token_account. - Actualiza
limit_order.settled_output. - No cierra la orden; sigue abierta frente a cualquier entrada restante.
CloseLimitOrder
Cierra una cuenta de orden completamente consumida. El alquiler siempre se devuelve a limit_order.owner independientemente de quién firme.
Caller — el owner o el limit_order_admin.
Precondiciones
- La orden tiene remanente sin ejecutar igual a cero (ya sea porque
amount == total_amountfue ejecutado y liquidado, o porque el dueño redujo previamente la orden a cero y olvidó cerrarla).
- Cierra
limit_order; el alquiler se envía alimit_order.owner.
CreateDynamicFeeConfig (admin)
Crea un conjunto de parámetros reutilizable bajo un índice u16.
Argumentos
Errores comunes —
InvalidDynamicFeeConfigParams si decay_period <= filter_period o algún campo con valor 0 está fuera de los límites.
UpdateDynamicFeeConfig (admin)
Modifica un DynamicFeeConfig existente. Los pools que ya tomaron una instantánea de la configuración en el momento de su creación no se actualizan retroactivamente; solo los pools recién creados que referencien esta configuración obtendrán los nuevos valores.
Argumentos — los mismos cinco campos de calibración que CreateDynamicFeeConfig (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator); el index se fija en la creación y no se vuelve a pasar aquí.
CollectProtocolFee / CollectFundFee
Tienen la misma forma que CollectProtocolFee / CollectFundFee de CPMM. El firmante debe coincidir con AmmConfig.owner / AmmConfig.fund_owner. Barre las comisiones de protocolo/fondo acumuladas de los vaults del pool hacia un destinatario, poniendo a cero los campos PoolState.protocol_fees_* / fund_fees_* correspondientes.
InitializeReward
Adjunta un nuevo flujo de recompensas a un pool. Pueden estar activos hasta 3 flujos simultáneamente.
Argumentos
Precondiciones
- Menos de 3 flujos activos actualmente en el pool.
- El financiador deposita
total_emission = emissions_per_second × (end_time − open_time)en tokens de recompensa en el vault como parte de esta instrucción. - Mint de recompensa en la lista blanca según
operation_state.
SetRewardParams
Extiende, recarga o cambia la tasa de emisión de un flujo de recompensas existente. Normalmente es llamado por el creador del pool o el multisig de Raydium. Las restricciones están en cadena: generalmente puedes extender end_time o aumentar las emisiones, pero no reducirlas retroactivamente. Consulta la lista de propietarios de operation_state.
UpdateRewardInfos
Contabilidad pura: liquida reward_growth_global_x64 al tiempo actual multiplicando emissions_per_second × Δt / liquidity. Es llamado internamente por cada instrucción que toca la liquidez. Se expone como instrucción independiente porque actores externos (interfaces, cranks) a veces quieren activarla.
CollectReward
El dueño de la posición reclama los tokens de recompensa adeudados.
Cuentas
Efecto
- Liquida el crecimiento de recompensas (mismo patrón que las comisiones).
- Transfiere el monto adeudado a la ATA destinataria, poniendo
reward_amount_owed[i]a cero.
Matriz de cambios de estado
Siguientes pasos
products/clmm/code-demos— ejemplos ejecutables en TypeScript.products/clmm/fees— detalles sobre el cálculo de comisiones y recompensas.reference/error-codes— tabla completa de errores Anchor de CLMM.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

