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 →
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
Cuentas (resumen) Precondiciones
  • token_mint_0 < token_mint_1 por orden de bytes.
  • amm_config.disable_create_pool == false.
  • Los mints no están rechazados por la lista de permitidos de extensiones Token-2022.
Postcondiciones
  • 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_info se 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
Cuentas (resumen) — iguales a 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_on se establece según la variante CollectFeeOn elegida.
  • Si se activó la comisión dinámica: pool_state.dynamic_fee_info se inicializa desde el DynamicFeeConfig proporcionado (se copian los cinco parámetros de calibración; los campos de estado se ponen a cero).
  • De lo contrario: pool_state.dynamic_fee_info se 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
Cuentas (resumen) 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 de pool.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 InitTickArray en la transacción).
  • El usuario tiene al menos amount_0_max y amount_1_max en las ATAs de origen.
Postcondiciones
  • personal_position existe, liquidity establecido, fee_growth_inside_last registrado como instantánea.
  • Las entradas del tick array en tick_lower y tick_upper se actualizan (liquidity_gross += L, liquidity_net ± L, instantáneas de crecimiento de comisiones mantenidas).
  • pool_state.liquidity += L si la posición está en rango (tick_lower ≤ tick_current < tick_upper).
Errores comunesInvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (si hay demasiados tick arrays).

IncreaseLiquidityV2

Agrega liquidez a una posición ya abierta. Argumentos
Cuentas — igual que 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_actual del usuario a los vaults.
  • Incrementa personal_position.liquidity y pool_state.liquidity (si está en rango), así como liquidity_gross / liquidity_net de 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 en DecreaseLiquidity o CollectReward, no al incrementar.

DecreaseLiquidityV2

Retira liquidez de una posición. Argumentos
Cuentas — misma forma que IncreaseLiquidity. Efecto
  • Calcula (amount_0, amount_1) para el L retirado dado el sqrt_price_x64 actual.
  • Liquida las comisiones y recompensas acumuladas desde el último toque, igual que IncreaseLiquidity.
  • Transfiere amount_0 + fees_owed_0 y amount_1 + fees_owed_1 de los vaults al usuario.
  • Decrementa los contadores de liquidez; si el nuevo personal_position.liquidity == 0, la posición es elegible para ClosePosition.
Slippageamount_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.
(Es decir, primero cobra todo y reduce a cero.) Efecto
  • Quema el NFT.
  • Cierra la cuenta del mint del NFT y la cuenta personal_position, devolviendo el alquiler al payer.

SwapV2

Recorre la curva de liquidez; entrada exacta o salida exacta según is_base_input. Argumentos
Cuentas (resumen) 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.status permite el swap.
  • now >= open_time.
  • sqrt_price_limit_x64 está en el lado correcto de sqrt_price_x64 según la dirección.
Errores comunesExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient. Lo que SwapV2 hace internamente y que los callers deben saber (versión post-2025):
  1. Recargo por comisión dinámica — si pool.dynamic_fee_info es 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 de products/clmm/fees) y suma un dynamic_fee_component sobre AmmConfig.trade_fee_rate. La comisión total está limitada al 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. 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 actualizan tick.unfilled_ratio_x64 y tick.part_filled_orders_remaining para liquidación posterior; las órdenes permanecen sin pagar hasta que su dueño llame a SettleLimitOrder.
  3. Enrutamiento de comisión unilateral — cuando pool.fee_on = Token0Only o Token1Only, 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 recibe out − fee); en las direcciones donde es la entrada, el comportamiento coincide con FromInput. Ver is_fee_on_input(zero_for_one) y is_fee_on_token0(zero_for_one) en PoolState.
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
Cuentas (resumen) Precondiciones
  • tick_index % pool.tick_spacing == 0 y dentro de [MIN_TICK, MAX_TICK].
  • tick_index está en el lado correcto de pool.tick_current para 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.status permite la operación de orden límite (bit 5).
Postcondiciones
  • limit_order existe, registrando tick.order_phase y tick.unfilled_ratio_x64 al momento de apertura.
  • tick.orders_amount += amount (en la cohorte actual).
  • limit_order_nonce.order_nonce += 1.
  • Se emite OpenLimitOrderEvent.
Errores comunesInvalidLimitOrderAmount (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
Cuentas — igual que 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 a DecreaseLimitOrder o SettleLimitOrder para avanzar.
Efecto
  • Transfiere amount desde la ATA del dueño al input_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
Cuentas — ambos lados de token, entrada y salida: Efecto
  • Recalcula el amount ejecutado de la orden a partir del unfilled_ratio_x64 de la cohorte desde la apertura.
  • Envía el output ejecutado a output_token_account.
  • Devuelve amount de la entrada sin ejecutar a input_token_account.
  • Actualiza limit_order en consecuencia. Si el nuevo remanente sin ejecutar es cero, el programa cierra la cuenta y devuelve el alquiler al owner.

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_amount fue ejecutado y liquidado, o porque el dueño redujo previamente la orden a cero y olvidó cerrarla).
Efecto
  • Cierra limit_order; el alquiler se envía a limit_order.owner.

CreateDynamicFeeConfig (admin)

Crea un conjunto de parámetros reutilizable bajo un índice u16. Argumentos
Cuentas Errores comunesInvalidDynamicFeeConfigParams 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
Cuentas 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

Fuentes: