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 →
Qué hace esto. Crea un nuevo pool CLMM en el nivel de comisión que elijas y luego abre una posición concentrada inicial. Dos transacciones en cuatro archivos — config.ts, createPool.ts, createPosition.ts y utils.ts — se ejecutan con npx tsx. El código proviene de las demostraciones oficiales en raydium-sdk-V2-demo/src/clmm y se ha adaptado para ejecutarse de forma independiente.

Configuración

Asegúrate de haber leído los requisitos previos de inicio rápido y de tener RPC_URL, KEYPAIR y las dependencias instaladas. Además de las dependencias del inicio rápido, necesitas:
  • decimal.js — matemáticas de precio y tick en createPool.ts y createPosition.ts.
  • bs58 — decodifica un keypair codificado en base58 en config.ts si usas KEYPAIR_BS58 en lugar de un archivo de clave JSON.
  • tsx — ejecuta los archivos .ts de abajo directamente vía npx tsx; a diferencia de los scripts de swap y CPMM, este no es un archivo .mjs simple ejecutado con node.
La creación de un pool CLMM tiene una comisión única más renta por array de tick para la posición inicial. También necesitarás ambos mints semilla en tu billetera — abrir una posición cuando el precio está dentro del rango elegido requiere liquidez en ambos lados. Ejecutar esto en devnet. Cambiar cluster a "devnet" en config.ts no es suficiente por sí solo. createPool.ts pasa un programId: CLMM_PROGRAM_ID explícito, una constante mainnet fija que no sigue cluster — cámbialo por la línea DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID comentada justo arriba. createPosition.ts también codifica un poolId mainnet (el pool RAY-USDC); reemplázalo con el ID del pool devnet que creaste en el Paso 2.

Paso 1 — config.ts

Guarda como config.ts. Tiene la misma estructura que el src/config.ts.template del repositorio de demostración — 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):
config.ts

Paso 2 — createPool.ts

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

Paso 3 — createPosition.ts

Fuente: src/clmm/createPosition.ts.
createPosition.ts

Paso 4 — utils.ts

Fuente: src/clmm/utils.ts.
utils.ts

Ejecutar

Qué acaba de suceder

Transacción 1 — raydium.clmm.createPool inicializó:
  • el estado del pool en el PDA canónico para (mint1, mint2, ammConfig),
  • token_0_vault y token_1_vault (ordenados por orden de bytes de mint),
  • el búfer de anillo de observation,
  • el bitmap de array de tick en línea,
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 tick en los límites inferior y superior (renta única si es la primera posición en esos rangos; los arrays de tick 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 la cantidad de par coincidente de mint2 (calculada 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 del rango. El rango utilizado arriba ([0.000001, 100000]) es efectivamente de rango completo; estréchalo para concentrar comisiones cerca del precio 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 la cantidad solicitada de mintA pero no la cantidad coincidente de mintB. 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 relativo al precio actual.
  • Precio obsoleto — Una cotización de la API puede estar 5–60 segundos obsoleta. Si executePosition falla en slippage, descomenta el bloque getRpcClmmPoolInfo en createPosition.ts para volver a obtener el precio en vivo justo antes de firmar.

Advertencias

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

Siguiente

Fuentes: