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 →
Raydium no publica un SDK oficial para Python. Los patrones aquí componen tres bibliotecas mantenidas por la comunidad: solders (primitivas de Solana vinculadas a Rust), solana-py (cliente RPC) y anchorpy (constructores de instrucciones al estilo Anchor a partir de IDLs). La combinación cubre todo lo que hace el SDK de TS; simplemente es menos pulida.

Entorno

Versiones que funcionan juntas en el momento de escribir esto:
anchorpy periódicamente se queda atrás de la versión de anchor-lang; para un programa Raydium recientemente desplegado, verifica que el IDL se compile bajo tu anchorpy fijada antes de hacer commit.

Conexión y keypair

AsyncClient es la variante async; el Client síncrono está disponible para scripts rápidos pero async es preferible para cualquier cosa que envíe múltiples solicitudes.

Lectura del estado del pool

La mayoría del uso en producción lee el estado del pool decodificado desde la API REST de Raydium (ver sdk-api/rest-api) en lugar de decodificar manualmente los datos en cadena — es más simple y la latencia es aceptable para la mayoría de casos de uso.
Para bots que necesitan la menor latencia posible, decodifica los bytes en cadena directamente:
El esquema completo está en src/raydium/cpmm/layout.ts (fuente de TS); transpórtalo a construct según sea necesario. anchorpy puede hacer esto automáticamente dado el IDL — ve abajo.

Construcción y envío de un swap

Para simplificar, usa el endpoint server-built-transaction de Raydium. El servidor devuelve una transacción lista para firmar; solo necesitas agregar tu firma:
Este es el camino más rápido hacia un bot funcional. La cotización del servidor caduca rápidamente (≈30s); no cachees.

Construcción de un swap del lado del cliente (vía anchorpy)

Para menor latencia o cuando no puedes acceder a la API de Raydium (regiones sancionadas, configuraciones aisladas):
Las derivaciones de PDA (estado de observación, autoridad del pool) siguen las mismas fórmulas que en el capítulo de CPMM. anchorpy no las deriva automáticamente.

Arquitectura típica de bot

Una estructura común de bot Raydium en Python:
Decisiones clave para producción:
  • Proveedor RPC. Los RPC públicos mainnet limitan la velocidad agresivamente. Usa un proveedor dedicado (Helius, QuickNode, Triton) para tráfico sostenido.
  • WebSocket para estado del pool. client.account_subscribe(pool_id) envía actualizaciones en cada cambio de estado. Mucho más ajustado que polling.
  • Proveedor de priority fee. Helius tiene un endpoint getPriorityFeeEstimate; Triton tiene el suyo. Dimensiona tu fee basándose en el percentil 75 de fees recientes en el programa objetivo.
  • Bundles para trades sensibles a MEV. Rutea a través del block engine de Jito si no puedes tolerar riesgo de sandwich. Librerías Python: jito-sdk-python (tercera parte, calidad varía).

Lectura del estado de la granja

El .account["X"].decode(bytes) de anchorpy da un objeto nativo de Python que coincide con el struct de IDL.

Trampas

1. Manejo de decimales

El float nativo de Python es IEEE-754 double; los montos en mints de 9 decimales (1 SOL = 1e9 unidades) se mantienen precisos pero las ratios y productos pierden precisión. Usa int (solders devuelve int para todos los campos de cantidad) y encamina a través de decimal.Decimal para cualquier aritmética de precios.

2. Razonamiento basado en slot vs basado en timestamp

Algunas versiones de granja usan contadores de slot; LaunchLab usa timestamps. solana-py devuelve slot en respuestas RPC, pero convertir slot → timestamp es con pérdida (varía según el schedule de leader). Si necesitas tiempo de pared, llama a get_block_time(slot) explícitamente.

3. Agotamiento del pool de conexión

AsyncClient abre una conexión HTTP por solicitud por defecto. Bajo carga alta, reutiliza sesiones de httpx.AsyncClient y establece un limits=httpx.Limits(max_connections=100) apropiado.

4. Límites de tamaño de transacción

Las transacciones construidas en Python no son más pequeñas que las construidas en TS — el límite de 1232 bytes se aplica por igual. Usa transacciones V0 (tablas de búsqueda de direcciones) para cualquier cosa que se enrute a través de más de ~2 pools.

Referencias

Fuentes: