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 →
Nota de versión. Todos los demos apuntan a @raydium-io/raydium-sdk-v2@0.2.42-alpha contra Solana mainnet-beta, verificado en 2026-04. Los IDs de programa provienen de reference/program-addresses a través del SDK.

Configuración

Cada demo de esta página refleja un archivo en raydium-sdk-V2-demo/src/clmm; el enlace a GitHub aparece junto a cada sección. La inicialización sigue el config.ts.template del repositorio de demos (fuente) — disableFeatureCheck: true es la configuración recomendada para cualquier integración no trivial:

Crear un pool CLMM

Fuente: src/clmm/createPool.ts
El SDK:
  • Ordena mint1/mint2 por orden de bytes antes de la derivación.
  • Calcula sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64).
  • Crea las cuentas observation y tick_array_bitmap_extension.
  • Paga la comisión de creación del pool definida por ammConfig.

Abrir una posición en un rango elegido

Fuente: src/clmm/createPosition.ts
El SDK calcula automáticamente qué arrays de ticks toca el rango e incluye instrucciones InitTickArray si alguno no está inicializado.

Aumentar la liquidez en una posición existente

Fuente: src/clmm/increaseLiquidity.ts

Reducir liquidez (y cobrar comisiones al mismo tiempo)

Fuente: src/clmm/decreaseLiquidity.ts y src/clmm/closePosition.ts
Para cobrar solo las comisiones, llama a decreaseLiquidity con liquidity = new BN(0). El efecto secundario de la instrucción es liquidar tokens_fees_owed_{0,1} y transferirlos al destino correspondiente. Para cerrar la posición por completo después de vaciar la liquidez y las comisiones, pasa closePosition: true en la última llamada a decreaseLiquidity. El SDK agrega ClosePosition y quema el NFT.

Cobrar recompensa(s)

Fuente: src/clmm/harvestAllRewards.ts
harvestAllRewards recorre cada posición de cada pool que se le pasa, agrupa las instrucciones CollectReward (y los UpdateRewardInfos necesarios), y las distribuye en varias transacciones si es necesario.

Swap

Fuente: src/clmm/swap.ts
computeAmountOutFormat recorre el mapa de ticks fuera de la cadena usando la misma lógica que el programa on-chain y devuelve:
  • la cantidad esperada de salida,
  • la cantidad mínima de salida tras el slippage,
  • la lista de cuentas de arrays de ticks que tocará el swap real (remainingAccounts).
Pasa siempre el remainingAccounts que devuelve la simulación: si pasas muy pocos, el swap revierte a mitad de la ejecución con TickArrayNotFound; si pasas cuentas desactualizadas, malgastas cómputo.

Crear un pool CLMM personalizable

createCustomizablePool es el nuevo punto de entrada que expone los controles de comisión dinámica y comisión unilateral en el momento de creación del pool. Acepta la misma estructura que createPool más tres campos adicionales:
createPool sigue funcionando para el camino de comisión por defecto, sin órdenes limitadas ni comisión dinámica. Usa createCustomizablePool cuando necesites cualquiera de los tres nuevos controles. Consulta products/clmm/instructions para ver la lista de cuentas on-chain.

Órdenes limitadas

Una orden limitada estaciona el input del usuario en un único tick y se ejecuta en orden FIFO cuando un swap cruza ese tick. Los resultados se envían al ATA del propietario en el momento de la liquidación; el propietario no necesita estar en línea para que se ejecute la orden.

Abrir una orden limitada

El SDK deriva el PDA LimitOrderState a partir de (pool, owner, tick, nonce), incrementa el LimitOrderNonce por (pool, owner) y agrega la orden a la cola FIFO en ese tick.

Aumentar / reducir una orden abierta

decreaseLimitOrder solo puede retirar de la parte no ejecutada de la orden; la parte ya ejecutada queda bloqueada hasta la liquidación. Ambas instrucciones revierten con InvalidOrderPhase si la orden ya se ha llenado por completo.

Liquidar una orden ejecutada

settleLimitOrder lee el unfilled_ratio_x64 de la orden frente al rastreador de la cola, calcula el output ejecutado y lo transfiere al ATA del propietario. El propietario puede llamarlo él mismo; limit_order_admin (un keeper operacional fuera de la cadena) también puede llamarlo en nombre del propietario — el output siempre va al propietario. Para cerrar órdenes completamente liquidadas y recuperar el rent, usa closeLimitOrder (individual) o closeAllLimitOrder (por lotes). Para liquidar varias a la vez, settleAllLimitOrder empaqueta tantas llamadas SettleLimitOrder como quepan en una transacción v0.

Consultar las órdenes activas de una wallet (fuera de la cadena)

El endpoint de órdenes activas devuelve en un solo payload tanto las órdenes no ejecutadas como las parcialmente ejecutadas (totalAmount / filledAmount / pendingSettle distinguen las fases). Para el historial de órdenes cerradas usa /limit-order/history/order/list-by-user?wallet=… (por wallet, paginado con nextPageId); para el registro completo de eventos de una orden concreta usa /limit-order/history/event/list-by-pda?pda=….

Esqueleto CPI en Rust

Orden de las cuentas restantes para SwapV2:
Si el swap nunca necesita la extensión, omítela; de lo contrario es la primera cuenta restante.

Errores frecuentes

  • Ticks de extremo con espaciado incorrectoInvalidTickIndex. Usa siempre TickUtils.getPriceAndTick para ajustar al tick válido.
  • Arrays de ticks insuficientes en SwapV2TickArrayNotFound. Usa computeAmountOutFormat para obtener la lista completa.
  • Posición de rango completo sin la extensión del bitmap → el PDA de extensión debe ser escribible; el SDK lo gestiona automáticamente.
  • Confundir sqrt_price_x64 con price → el error de factor 2 que esto provoca es especialmente difícil de depurar. Si tienes dudas, deja que el SDK lo calcule a partir de un precio legible.
  • Cobrar recompensas con demasiada frecuencia → cada cobro consume una transacción. Usa harvestAllRewards para agrupar varias posiciones en un solo lote.
  • Quemar el NFT mientras el mint todavía tiene rent pendienteClosePosition también cierra el mint del NFT y el ATA; no los cierres por separado o el programa revertirá.
  • Abrir una orden limitada en un tick sin el espaciado correctoInvalidTickIndex. Cuantiza siempre con TickUtils.getPriceAndTick.
  • Llamar a decreaseLimitOrder sobre una orden completamente ejecutadaInvalidOrderPhase. Usa settleLimitOrder y luego closeLimitOrder.
  • Olvidar dynamicFeeConfigId al pasar enableDynamicFee: trueCreateCustomizablePool revertirá con InvalidDynamicFeeConfigParams. Desactiva la comisión dinámica o elige una configuración desde /main/clmm-dynamic-config.

Próximos pasos

Fuentes: