Skip to main content
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 →

Configuración

Cada demostración en esta página refleja un archivo en raydium-sdk-V2-demo/src/clmm; el enlace de GitHub aparece junto a cada sección. El arranque sigue el config.ts.template del repositorio de demostración (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 liquidez en una posición existente

Fuente: src/clmm/increaseLiquidity.ts

Disminuir liquidez (y cobrar comisiones al mismo tiempo)

Fuente: src/clmm/decreaseLiquidity.ts y src/clmm/closePosition.ts
Para cobrar solo 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. Para cerrar completamente la posición después de poner la liquidez y las comisiones en cero, pasa closePosition: true en la última llamada a decreaseLiquidity. El SDK añade ClosePosition y quema el NFT.
Las posiciones de emisor restringido requieren un constructor de cierre compatible. Estas posiciones tienen una cuenta de token NFT congelada. ClosePosition debe añadir el ID del pool de la posición como la primera cuenta restante para que CLMM pueda descongelar la cuenta antes de quemar el NFT. La rama del código del programa no incluye un cambio en el SDK. Confirma que tu versión del SDK soporta explícitamente la ruta de cierre congelado antes de habilitar la creación de posiciones de emisor restringido.
Para un cliente Anchor directo, mantén las cuentas declaradas sin cambios y añade el pool:
Puedes pasar poolId en cada cierre. CLMM lo lee solo cuando positionNftAccount está congelada, lo que mantiene una ruta de cliente compatible con posiciones antiguas y nuevas.

Cobrar recompensa(s)

Fuente: src/clmm/harvestAllRewards.ts
harvestAllRewards recorre cada posición en cada pool pasado, agrupa instrucciones CollectReward (y cualquier UpdateRewardInfos), y las divide entre 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 en cadena y devuelve:
  • la cantidad esperada,
  • la cantidad mínima después del slippage,
  • la lista de cuentas de array de ticks que el swap real tocará (remainingAccounts).
Siempre pasa remainingAccounts devuelto por la simulación: si pasas muy pocos, el swap se revierte a mitad del recorrido con TickArrayNotFound; si pasas unos obsoletos, se desperdicia cómputo.

Crear un pool CLMM personalizable

createCustomizablePool es el nuevo punto de entrada que expone los toggles de comisión dinámica y comisión unilateral en el momento de la creación del pool. Tiene la misma forma que createPool más tres adiciones:
createPool continúa funcionando para la ruta de comisión predeterminada, sin órdenes limitadas y sin comisión dinámica. Usa createCustomizablePool siempre que necesites cualquiera de los tres nuevos controles. Ver products/clmm/instructions para la lista de cuentas en cadena.

Órdenes limitadas

Una orden limitada estaciona la entrada del usuario en un único tick y se completa 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 ser completado.

Abrir una orden limitada

El SDK deriva el PDA LimitOrderState de (pool, owner, tick, nonce), incrementa el LimitOrderNonce por-(pool, owner), e inserta la orden en la cohorte FIFO en ese tick.

Aumentar / disminuir una orden abierta

decreaseLimitOrder solo puede eliminar de la porción no completada de la orden; la porción completada está bloqueada hasta la liquidación. Ambas instrucciones se revierten con InvalidOrderPhase si la orden ya ha sido completada totalmente.

Liquidar una orden completada

settleLimitOrder lee el unfilled_ratio_x64 de la orden contra el rastreador de cohorte, calcula la salida completada y la transfiere al ATA del propietario. El propietario puede llamar a esto él mismo; limit_order_admin (un guardián operacional fuera de la cadena) también puede llamarlo en nombre del propietario — la salida aún va al propietario. Para cerrar órdenes completadas totalmente y recuperar alquiler, usa closeLimitOrder (individual) o closeAllLimitOrder (lote). Para liquidar muchas a la vez, settleAllLimitOrder empaqueta tantas llamadas SettleLimitOrder como quepan en una tx v0.

Listar órdenes estacionadas de una billetera (fuera de la cadena)

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

Esqueleto de Rust CPI

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

Errores comunes

  • Endpoints de tick fuera de espaciadoInvalidTickIndex. Siempre ajusta mediante TickUtils.getPriceAndTick.
  • No hay suficientes arrays de ticks suministrados en SwapV2TickArrayNotFound. Usa computeAmountOutFormat para obtener la lista completa.
  • Posición de rango completo sin la extensión de bitmap → el PDA de extensión debe ser escribible; el SDK lo maneja automáticamente.
  • Confundir sqrt_price_x64 con price → una confusión de factor-2 aquí es particularmente dolorosa. Cuando tengas dudas, deja que el SDK lo calcule a partir de un precio legible por humanos.
  • Cobrar recompensas demasiado ávidamente → cada cobro cuesta una transacción. Agrupa mediante harvestAllRewards en muchas posiciones.
  • Cerrar cuentas NFT tú mismoClosePosition quema el NFT y cierra su ATA. También cierra un mint NFT de Token-2022; un mint SPL Token clásico permanece en suministro cero porque ese programa no puede cerrar mints. No cierres cuentas soportadas por separado o la instrucción se revertirá.
  • Abrir una orden limitada en un tick no espaciadoInvalidTickIndex. Siempre cuantiza mediante TickUtils.getPriceAndTick.
  • Llamar a decreaseLimitOrder en una orden completada totalmenteInvalidOrderPhase. Usa settleLimitOrder luego closeLimitOrder en su lugar.
  • Olvidar dynamicFeeConfigId mientras pasas enableDynamicFee: true → la reversión de CreateCustomizablePool es InvalidDynamicFeeConfigParams. O desactiva la comisión dinámica, o elige una configuración de /main/clmm-dynamic-config.

Dónde ir a continuación

Fuentes: