Passer au contenu principal
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Raydium ne publie pas de SDK Python officiel. Les patterns présentés ici composent trois bibliothèques communautaires bien maintenues : solders (primitives Solana liées à Rust), solana-py (client RPC) et anchorpy (constructeurs d’instructions de style Anchor à partir des IDL). Cette combinaison couvre tout ce que fait le SDK TS, juste un peu moins polie.

Environnement

Versions qui fonctionnent ensemble actuellement :
anchorpy accuse parfois du retard par rapport à anchor-lang ; pour un programme Raydium récemment déployé, vérifiez que l’IDL compile sous votre version épinglée d’anchorpy avant de vous engager.

Connexion et keypair

AsyncClient est la variante async ; le Client sync est disponible pour les scripts rapides mais async est préféré pour tout ce qui envoie plusieurs requêtes.

Lecture de l’état du pool

La plupart des usages de production lisent l’état du pool décodé depuis l’API REST de Raydium (voir sdk-api/rest-api) plutôt que de décoder manuellement les données on-chain — c’est plus simple et la latence est acceptable pour la plupart des cas d’usage.
Pour les bots qui nécessitent une latence minimale, décodez directement les octets on-chain :
Le layout complet se trouve dans src/raydium/cpmm/layout.ts (source TS) ; portez-le vers construct selon vos besoins. anchorpy peut faire cela automatiquement à partir de l’IDL — voir ci-dessous.

Construire et envoyer un swap

Pour la simplicité, utilisez le endpoint server-built-transaction de Raydium. Le serveur retourne une transaction prête à signer ; vous devez seulement ajouter votre signature :
C’est le chemin le plus rapide vers un bot fonctionnel. Le quote du serveur expire rapidement (≈30s) ; ne le mettez pas en cache.

Construire un swap côté client (via anchorpy)

Pour une latence plus faible ou quand vous ne pouvez pas accéder à l’API de Raydium (régions sanctionnées, configurations isolées) :
Les dérivations PDA (observation state, pool authority) suivent les mêmes formules que dans le chapitre CPMM. anchorpy ne les dérive pas automatiquement.

Architecture type d’un bot

Une structure courante de bot Python Raydium :
Décisions clés pour la production :
  • Fournisseur RPC. Les RPC publiques mainnet rate-limitent agressivement. Utilisez un fournisseur dédié (Helius, QuickNode, Triton) pour un trafic soutenu.
  • WebSocket pour l’état du pool. client.account_subscribe(pool_id) pousse les mises à jour à chaque changement d’état. Beaucoup plus serré que du polling.
  • Fournisseur de frais de priorité. Helius a un endpoint getPriorityFeeEstimate ; Triton a le sien. Dimensionnez votre frais selon le 75e percentile des frais récents sur le programme cible.
  • Bundles pour les trades sensibles au MEV. Routez par le moteur de bloc de Jito si vous ne pouvez pas tolérer le risque de sandwich. Libs Python : jito-sdk-python (tiers, qualité variable).

Lecture de l’état du farm

Le .account["X"].decode(bytes) d’anchorpy donne un objet Python natif correspondant à la struct IDL.

Pièges

1. Gestion des décimales

Le float natif de Python est IEEE-754 double ; les montants dans les mints à 9 décimales (1 SOL = 1e9 unités) restent précis mais les ratios et les produits perdent en précision. Utilisez int (solders retourne int pour tous les champs de montant) et routez par decimal.Decimal pour tout calcul arithmétique de prix.

2. Raisonnement basé sur les slots vs basé sur les timestamps

Certaines versions de farm utilisent des compteurs de slots ; LaunchLab utilise des timestamps. solana-py retourne slot dans les réponses RPC, mais convertir slot → timestamp n’est pas sans perte (varie selon le planning des leaders). Si vous avez besoin de l’heure murale, appelez get_block_time(slot) explicitement.

3. Épuisement du pool de connexions

AsyncClient ouvre une connexion HTTP par requête par défaut. Sous charge élevée, réutilisez les sessions httpx.AsyncClient et définissez une limits=httpx.Limits(max_connections=100) appropriée.

4. Limites de taille de transaction

Les transactions construites en Python ne sont pas plus petites que celles construites en TS — la limite de 1232 octets s’applique équitablement. Utilisez les transactions V0 (address lookup tables) pour tout ce qui route par plus de ~2 pools.

Ressources

Sources :