Au cœur du swap Stellar le plus rapide : l'évaluation multi-routes expliquée
Comment Shadow Pocket évalue les routes orderbook et AMM en parallèle pour trouver le meilleur taux de swap sur Stellar, actualisé à chaque ledger.
La plupart des interfaces DEX sur Stellar choisissent une seule route pour votre swap. Elles consultent l'orderbook, jettent peut-être un coup d'œil à un pool de liquidité, et vous donnent un chiffre. Shadow Pocket fait quelque chose de fondamentalement différent : il évalue chaque route possible en parallèle et envoie 100 % de votre transaction via celle qui retourne le meilleur résultat.
Le problème des swaps mono-route
Lorsque vous échangez l'Actif A contre l'Actif B sur Stellar, plusieurs plateformes d'exécution sont disponibles :
- L'orderbook SDEX — des ordres limités placés par des traders et des market makers.
- Les pools de liquidité AMM — des pools à produit constant où le prix est déterminé algorithmiquement.
- Les chemins inter-paires — des routes qui passent de A à C puis à B, en utilisant des actifs intermédiaires comme passerelles.
Une approche mono-route en choisit une et espère que c'est la meilleure. Mais la liquidité change à chaque fermeture de ledger (environ toutes les 5 secondes). L'orderbook peut offrir un excellent prix à faible profondeur, mais s'effondrer pour des montants plus importants. Un pool peut offrir de meilleurs taux pour les gros swaps grâce à sa courbe de liquidité continue. Et parfois, un chemin inter-paires via XLM ou USDC surpasse les deux options directes.
Se tromper de route coûte de l'argent réel à l'utilisateur.
Comment fonctionne l'évaluation parallèle
Le backend de Shadow Pocket évalue toutes les routes disponibles indépendamment pour chaque demande de cotation. Voici le processus :
- Découverte — le système identifie toutes les routes viables : l'orderbook direct, chaque pool AMM pertinent et les chemins inter-paires via les principaux actifs passerelles.
- Simulation parallèle — chaque route est simulée indépendamment avec le montant exact saisi. La simulation de l'orderbook parcourt le carnet d'ordres, remplissant les ordres à chaque niveau de prix. Les simulations de pools utilisent la formule du produit constant. Les simulations de chemins enchaînent plusieurs opérations.
- Comparaison des résultats — chaque route retourne un montant de sortie simulé, tenant compte du slippage au montant spécifique.
- Sélection du gagnant — la route avec le meilleur résultat est sélectionnée. Pas de fractionnement, pas de remplissages partiels — 100 % de la transaction passe par le meilleur chemin.
Le backend retourne toujours le résultat de l'orderbook en premier dans la réponse, suivi des routes de pools, afin que le frontend puisse afficher les informations de liquidité par route, même si seule la meilleure route est exécutée.
Pourquoi 100 % sur une seule route (sans fractionnement)
Le fractionnement de route semble intelligent en théorie : envoyer une partie de votre transaction via l'orderbook et une autre via un pool pour minimiser l'impact sur le prix. En pratique, sur Stellar, cela introduit une complexité qui se justifie rarement :
- Les frais de transaction sont négligeables — il n'y a aucune raison d'optimiser le gas par regroupement.
- Exécution atomique — les transactions Stellar réussissent entièrement ou échouent entièrement. Le fractionnement ajoute des opérations qui augmentent le risque d'échec partiel.
- Timing du ledger — les prix changent toutes les 5 secondes. Le temps qu'un ordre fractionné s'exécute, le ratio optimal de répartition a peut-être déjà changé.
Pour la grande majorité des volumes de transactions sur Stellar, envoyer 100 % via la meilleure route unique surpasse toute stratégie de fractionnement. Le calcul est simple : simuler toutes les options, choisir le gagnant.
Rafraîchissement déclenché par le ledger via SSE
Les cotations de swap deviennent rapidement obsolètes. Shadow Pocket les maintient à jour grâce aux Server-Sent Events (SSE) connectés au flux de ledgers de Stellar :
- Le frontend ouvre une connexion SSE vers le endpoint
/ledgers?cursor=now. - Chaque fois qu'un nouveau ledger se ferme (~5 secondes), l'événement se déclenche.
- Le frontend applique un debounce et lance une nouvelle demande de cotation.
- Le backend réévalue toutes les routes avec l'état actuel de l'orderbook et des pools.
- L'interface met à jour le taux affiché, le montant de sortie et la répartition par route.
Ainsi, l'utilisateur voit toujours une cotation qui reflète l'état du ledger actuel — pas une donnée vieille de 30 secondes qui a peut-être significativement évolué.
Détails d'implémentation
Quelques décisions d'ingénierie qui assurent la fiabilité du système :
Gestion du timer de debounce — le timer de debounce du rafraîchissement de cotation doit être correctement annulé dans le callback du setTimeout. Si la référence du timer est périmée, l'interface peut rester bloquée sur un état de chargement indéfiniment.
Indépendance de l'état de chargement — l'indicateur de chargement de la cotation de swap est réinitialisé en dehors de la vérification du signal d'abandon. Cela empêche un blocage où une requête annulée laisse l'interface en état de chargement permanent.
Contournement du Service Worker — le type de contenu SSE text/event-stream est exclu de la logique de précache du Service Worker. Sans ce contournement, le Service Worker intercepterait la connexion streaming et casserait les mises à jour en temps réel.
Évaluation indépendante des routes — le backend n'utilise pas une approche gloutonne (vérifier l'orderbook d'abord, puis combler le reste avec les pools). Chaque route est évaluée pour le montant total de manière indépendante, garantissant une comparaison équitable.
Le résultat
L'utilisateur voit une interface de swap qui se met à jour en temps réel, qui montre exactement quelle route sa transaction empruntera, et qui garantit le meilleur taux disponible sur l'ensemble des plateformes d'exécution de Stellar. Pas de sélection manuelle de route, pas de cotations obsolètes, pas de devinettes sur le fractionnement.
Un swap rapide, ce n'est pas une question de vitesse brute — c'est avoir toujours l'information la plus fraîche et la plus précise au moment où l'on clique sur "Swap".