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 →
Las billeteras que integran Raydium típicamente necesitan responder cuatro preguntas por usuario: ¿en qué pools tiene este usuario LP? ¿qué posiciones (NFTs de CLMM) posee? ¿en qué granjas tiene apuestas? ¿cuánto vale todo? Esta página documenta cada una.

Detectar posiciones de Raydium

Tokens LP clásicos (CPMM, AMM v4)

Se ven como cualquier otro token SPL: la ATA del usuario contiene un saldo. Una billetera lo muestra como otro token por defecto. Para revelarlo como una posición LP de Raydium:
  1. Enumera las cuentas de token del usuario: connection.getParsedTokenAccountsByOwner(user, { programId: TOKEN_PROGRAM_ID }).
  2. Para cada mint, verifica la lista de mints de Raydium: GET https://api-v3.raydium.io/pools/info/lps?lps=<LP_MINT>,... (agrupa hasta ~50 mints LP por llamada).
  3. Para los mints que coincidan, la API devuelve la referencia del pool. Úsala para calcular el valor de la posición denominado en tokens:
Muestra tanto el saldo LP como los montos desenvueltos — los usuarios piensan en tokens subyacentes, no en unidades LP.

NFTs de posición CLMM

Las posiciones CLMM son NFTs. El PDA PersonalPositionState de cada posición se deriva del mint del NFT. Para detectar:
  1. Enumera los NFTs del usuario. Para NFTs Metaplex heredados: filtra cuentas de token a aquellas con suministro 1 y decimales 0.
  2. Para cada mint de NFT, intenta derivar el PDA de PersonalPositionState:
  1. Enumera las posiciones de la billetera con raydium.clmm.getOwnerPositionInfo({ programId }) y coincide en nftMint (no hay getPositionInfo). Cada entrada te proporciona:
    • poolId → obtén el pool para resolver mints
    • tickLower, tickUpper → muestra el rango
    • liquidity, tokensOwedA/B → calcula el valor de la posición + comisiones pendientes
    • rewardInfos → recompensas pendientes por stream
  2. Para NFTs de posición emitidos bajo Token-2022 (OpenPositionWithToken22Nft), el programa del mint del NFT es Token-2022 en lugar de SPL Token. Enumera ambos al escanear.

Apuestas en granjas

Farm v3 / v5 / v6 cada una tiene un PDA de libro mayor por usuario. Derivaciones:
Para billeteras que prefieren detección completamente en cadena: itera PDAs posibles de UserLedger hasheando el usuario con una lista curada de IDs de granja “probables”. Enumerar todos los IDs de granja exhaustivamente es impracticable (existen miles); usa la API.

Calcular el valor de la posición

LP CPMM / AMM v4

Los tres módulos no comparten una firma: liquidity.getPoolInfoFromRpc toma { poolId }, mientras que cpmm.getPoolInfoFromRpc y clmm.getPoolInfoFromRpc toman una cadena base58 posicional.
Luego multiplica cada uno por el precio USD del mint (de raydium.token u un oráculo de precios).

Posición CLMM

Renderiza como:
  • Valor de liquidez (precio actual)
  • Comisiones no cobradas
  • Recompensas pendientes por stream
  • Rango: [tickLower_price, tickUpper_price] con una barra visual mostrando si el precio actual está dentro del rango

Apuesta en granja

Para cálculo en cadena, refleja la contabilidad de la granja:
Asegúrate de actualizar reward_per_share_x64 con la fórmula de actualización perezosa antes de calcular (tiempo transcurrido × tasa de emisión ÷ total_staked).

Simulación de transacción para vista previa

Antes de que un usuario firme, las billeteras generalmente previsualizan los cambios de saldo. Usa simulateTransaction:
El parámetro accounts le pide al validador que devuelva el estado de la cuenta posterior a la simulación para las direcciones listadas. Mucho más preciso que intentar predecir el cambio de saldo solo desde la forma de la instrucción.

Trampas de simulación

  • Los swaps CLMM necesitan arrays de tick válidos. Si el tamaño de entrada del usuario cruzaría un array de tick no inicializado, la simulación se revierte (igual que la ejecución). Muestra esto claramente en la interfaz.
  • Comisión de prioridad. La simulación se ejecuta sin las instrucciones de presupuesto de cómputo aplicadas. Para una transacción grande que excedería los 200k CU por defecto, la simulación falla pero la ejecución real con un límite de CU explícito tiene éxito. Siempre establece el límite de CU en la tx simulada también.
  • Blockhash fresco. La simulación usa el blockhash actual; si la firma toma >60s la tx se vuelve inválida. Re-simula si el usuario duda.

Visualización de Token-2022

Los tokens bajo el programa Token-2022 deben etiquetarse como tales en la lista de tokens de la billetera, ya que tienen superficies de riesgo diferentes:
  • Mints con comisión de transferencia: muestra los transferFeeBasisPoints actuales como “Comisión de transferencia: X%” junto al saldo. Advierte al recibir — los usuarios pueden no darse cuenta de que recibirán menos de lo que el remitente envió.
  • Mints con gancho de transferencia: muestra el ID del programa del gancho. Un gancho malicioso puede bloquear transferencias salientes; los usuarios deben verificar que el gancho sea el que esperan.
  • Mints no transferibles: muestra “No transferible” y desactiva swap/envío. Estos son típicamente tokens vinculados al alma o credenciales.
  • Mints que generan interés: el saldo de la interfaz derivado de TokenAccount.amount no refleja el interés acumulado. Usa amountToUiAmount de @solana/spl-token (que aplica el factor de escala) para el valor mostrado.

Visualización de APR de granja

El APR mostrado a los usuarios debe combinar todos los streams de recompensas activos, convertidos a USD, y anualizados:
Muestra como APR: X.Y%. Si el mint de apuesta es un token LP, también calcula el APR de comisión base del LP subyacente y etiqueta la suma como “APR Total” o “APR + comisiones”.

Referencias

Fuentes:
  • Raydium SDK v2 — ayudantes de posición/granja.
  • Endpoints de posición de usuario en api-v3.raydium.io.