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 →
Qué hace esto. Crea un nuevo pool CLMM en el nivel de comisión que elijas, luego abre una posición concentrada inicial. Dos transacciones, un script. El código está adaptado de los demos oficiales en raydium-sdk-V2-demo/src/clmm en un único archivo ejecutable en Node.

Configuración

Asegúrate de haber leído los requisitos previos de Inicio rápido y tengas RPC_URL, KEYPAIR e instaladas las dependencias. La creación de un pool CLMM tiene una comisión única más renta por array de ticks para la posición inicial. También necesitarás ambas mints de semilla en tu billetera — abrir una posición cuando el precio está dentro del rango elegido requiere liquidez en ambos lados.

Paso 1 — config.ts

Guarda como config.ts. Tiene la misma estructura que el src/config.ts.template del repo demo — disableFeatureCheck se fuerza a true (recomendado para cualquier integración no trivial para que el SDK no se bloquee en su llamada de detección de características al inicio):

Paso 2 — createPool.ts

Guarda junto a config.ts. Fuente: src/clmm/createPool.ts.

Paso 3 — createPosition.ts

Fuente: src/clmm/createPosition.ts.

Paso 4 — utils.ts

Fuente: src/clmm/utils.ts.

Ejecutar

Qué acaba de suceder

Transacción 1 — raydium.clmm.createPool inicializó:
  • el estado del pool en la PDA canónica para (mint1, mint2, ammConfig),
  • token_0_vault y token_1_vault (ordenados por byte de mint),
  • el búfer ring de observation,
  • el bitmap de array de ticks inline,
y estableció el sqrt_price_x64 inicial desde tu initialPrice. Transacción 2 — raydium.clmm.openPositionFromBase abrió una posición concentrada:
  • acuñó un NFT de posición en tu billetera (el NFT es la posición; transferirlo transfiere la posición),
  • asignó arrays de ticks en los límites inferior y superior (renta única si es la primera posición en esos rangos; los arrays de ticks nunca se cierran por el programa, por lo que las posiciones posteriores en los mismos arrays no pagan renta adicional),
  • depositó inputAmount de mint1 y el monto de par coincidente de mint2 (calculado por PoolUtils.getLiquidityAmountOutFromAmountIn),
  • acreditó la posición con liquidez proporcional al ancho del rango.
Cuanto más estrecho sea el rango, mayor será la eficiencia de capital por dólar de TVL — y más dolorosa será la pérdida impermanente cuando el precio se desvíe fuera de rango. El rango usado arriba ([0.000001, 100000]) es efectivamente rango completo; estréchalo para concentrar comisiones cerca del spot actual.

Elegir un nivel de comisión

clmmConfigs[0] es el nivel de comisión más bajo. El conjunto completo se publica en GET https://api-v3.raydium.io/main/clmm-config: Consulta user-flows/choosing-a-pool-type para una matriz de decisión completa.

Errores comunes

  • Pool already exists for this config — Ya existe un pool CLMM para este triple (mint1, mint2, ammConfig). Busca el ID del pool existente y salta el Paso 2.
  • Insufficient funds for amount B — Tu billetera tiene el monto solicitado de mintA pero no el mintB coincidente. Abrir una posición cuando el precio está dentro del rango requiere liquidez en ambos lados.
  • Tick out of range — Tu lowerPrice o upperPrice cae fuera del rango de precio representable. Usa un rango más razonable en relación al precio actual.
  • Precio obsoleto — Una cotización de la API puede estar 5–60 segundos obsoleta. Si executePosition falla por slippage, descomenta el bloque getRpcClmmPoolInfo en createPosition.ts para obtener el precio en vivo justo antes de firmar.

Advertencias

  • El NFT de posición es tu único acceso. Pierde el NFT o transfierelo, pierde acceso a la posición. Trátalo como una llave.
  • Las posiciones fuera de rango no ganan comisiones. Si el precio se mueve fuera de [lowerPrice, upperPrice], tu posición está estacionada completamente en un activo y no gana nada hasta que reequilibres.
  • La renta de array de ticks es unidireccional. La primera posición que toca un array de ticks nunca inicializado paga su renta; el programa no expone una ruta para cerrar arrays de ticks, por lo que esa renta es permanente. Las posiciones posteriores en el mismo array son gratuitas.

Siguiente

Fuentes: