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
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
- Ordena
mint1/mint2por orden de bytes antes de la derivación. - Calcula
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - Crea las cuentas
observationytick_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
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
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).
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
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)
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
SwapV2:
Errores frecuentes
- Ticks de extremo con espaciado incorrecto →
InvalidTickIndex. Usa siempreTickUtils.getPriceAndTickpara ajustar al tick válido. - Arrays de ticks insuficientes en
SwapV2→TickArrayNotFound. UsacomputeAmountOutFormatpara 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_x64conprice→ 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
harvestAllRewardspara agrupar varias posiciones en un solo lote. - Quemar el NFT mientras el mint todavía tiene rent pendiente →
ClosePositiontambié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 correcto →
InvalidTickIndex. Cuantiza siempre conTickUtils.getPriceAndTick. - Llamar a
decreaseLimitOrdersobre una orden completamente ejecutada →InvalidOrderPhase. UsasettleLimitOrdery luegocloseLimitOrder. - Olvidar
dynamicFeeConfigIdal pasarenableDynamicFee: true→CreateCustomizablePoolrevertirá conInvalidDynamicFeeConfigParams. Desactiva la comisión dinámica o elige una configuración desde/main/clmm-dynamic-config.
Próximos pasos
sdk-api/typescript-sdk— superficie completa del SDK.sdk-api/rest-api— endpoints de cotización y metadatos de pools.user-flows/create-clmm-pool— guía sin código.integration-guides/aggregator— enrutamiento de CLMM como parte de una ruta.

