Aller au contenu
FeelB

corentin@feelb:~$ cd ~/blockchain

English

Ce qu'il faut vraiment pour encaisser sur la blockchain.

J'ai construit et j'opère l'infrastructure complète d'Abyxo, passerelle de paiement multi-chain : nœuds, RPC/gRPC, encaissement, Lightning, swap & bridge, payouts. Cette page détaille chaque brique — le même socle peut porter votre produit.

~/blockchain/capacites

Six briques, toutes en production.

$ payment.confirmed

Encaissement multi-chain

Passerelle de paiement complète : un processeur dédié par chaîne (13 en production, socle EVM générique pour les suivantes), détection des confirmations adaptée à chaque réseau, réconciliation automatique, stablecoins USDC / USDT / PYUSD. Du checkout au webhook marchand.

Shkeeper · Stablecoins · Webhooks

$ getblockchaininfo

Nodes auto-hébergés

Bitcoin, Ethereum, Litecoin, Dogecoin, Bitcoin Cash, Sui, Sei, Cronos, Hyperliquid… hébergés sur infrastructure propre — pas de dépendance à un fournisseur RPC tiers pour le cœur du système. Solana fait exception : les endpoints viennent d'un fournisseur tiers, appelé en direct. Monitoring de synchronisation et alerting sur le retard de blocs.

Bitcoin Core · Geth · Sui · Sei · Hyperliquid

$ erpc.yaml

RPC — proxy & haute dispo

Proxy eRPC devant les nœuds EVM : cache, failover automatique entre upstreams redondants — plusieurs nœuds maison par chaîne, fallbacks publics en dernier recours. Côté UTXO (Bitcoin, Litecoin, Dogecoin, Bitcoin Cash), c'est un load balancer HAProxy qui répartit sur les nœuds et sort ceux qui décrochent. Solana et les flux gRPC sont appelés en direct.

eRPC · HAProxy · Failover · Cache

$ HyperliquidL1Gateway

gRPC — streaming temps réel

Gateway gRPC maison qui streame la L1 Hyperliquid depuis un nœud local : blocs, fills, diffs d'orderbook, events. Schéma compatible avec l'API commerciale équivalente, plus des RPC supplémentaires. Index Redis pour l'historique : de ~22 s à ~0,4 s sur un fichier horaire de 3,7 Go.

gRPC · Hyperliquid · Redis

$ lightning · 1 conf

Lightning Network

Encaissement Bitcoin instantané via Lightning, en complément de l'on-chain : paiements à faible montant, confirmation immédiate, coûts réduits — le checkout choisit le rail selon le montant.

Lightning · Bitcoin · Micropaiements

$ exact-output

Swap & bridge cross-chain

Le marchand encaisse dans une crypto, retire dans une autre : swaps exact-output (le montant promis est livré, au centime), routés au meilleur prix entre DEX on-chain et rails cross-chain. Les ponts sont mis en concurrence à chaque devis — le moins cher dépend du montant, pas seulement de la paire — et le swap se compose en plusieurs sauts quand aucune route directe n'existe. Détail complet ci-dessous — c'est la brique la plus sensible, elle mérite sa section.

Swap · Bridge · Multi-sauts · Best execution

~/blockchain/payout-executor

Zoom sur la brique la plus sensible : le swap/bridge de payout.

Un marchand encaisse en USDC et veut être payé en EUR-stable, en SOL, ou sur TRON : entre les deux, il y a un système qui détient des clés et diffuse des transactions irréversibles. Voilà comment il est conçu.

Deux couches, séparation stricte des clés

Le backoffice (couche 1) décide : validation, routage, devis. L'exécuteur (couche 2) détient seul les hot wallets et signe. C'est un worker pull-based : aucune API entrante métier, un seul port ouvert pour les probes Kubernetes — il va chercher le travail via l'API interne authentifiée du backoffice. Les clés ne sont jamais exposées côté plan public.

Funding just-in-time, wallet jamais pré-approvisionné

Pour chaque retrait, l'exécuteur demande le montant source plus un buffer, attend l'arrivée des fonds, exécute le swap en exact-output, puis balaie le reliquat vers un wallet collecteur par chaîne. Le hot wallet ne porte jamais plus que le retrait en cours.

Jamais de double paiement

Le txid est ancré avant la diffusion : sur Solana la signature est déterministe (fenêtre nulle), sur EVM la transaction est signée localement et son hash enregistré avant l'envoi, le nonce servant de second filet. Au redémarrage, le statut on-chain du dernier tx est revérifié avant toute reprise : confirmé → on clôture sans renvoyer ; en attente → on attend ; échoué → on reconstruit. Le même invariant vaut un cran plus haut, sur le funding : la tentative est ancrée en base avant l'appel, et si la réponse se perd on interroge son statut au lieu de la rejouer.

Crash-safety & récupération

Les retraits orphelins (crash entre claim et complétion) sont repris automatiquement et de façon idempotente. Un échec avant diffusion balaie les fonds vers le collecteur et rejette proprement — rien ne reste bloqué sur le hot wallet. Chaque retrait a son propre fichier de log, qui raconte toute son histoire d'un seul tenant.

Best execution entre DEX

Sur EVM, chaque swap est quoté sur tous les DEX V3 (tous les fee tiers) et sur Uniswap V4 via l'Universal Router (Permit2, natif direct sans wrapping) — les quotes sont des eth_call gratuits — puis routé vers le moins cher. Testé en réel on-chain sur Arbitrum, Base et BNB Chain. Côté Solana : Jupiter, avec livraison SPL directe au marchand.

Rails cross-chain, y compris en multi-sauts

THORChain pour la liquidité native LTC / DOGE / XRP / BCH / ATOM (TSS vaults, sans wrapping ni custody), deBridge DLN pour l'EVM↔EVM et Solana (un ordre livré par solver en ~15 s en conditions réelles), Omniston/STON.fi pour TON avec escrow HTLC, Symbiosis pour les chaînes que les autres desservent mal, NEAR Intents en rail généraliste — il signe sur trois familles de chaînes (EVM, Tron, Solana) et livre aussi bien Cardano, Sui ou Stellar qu'une paire EVM ordinaire, quand il est le moins cher. Quand aucune route directe n'existe — une chaîne qu'un rail ne couvre pas, ou un actif qu'il ne couvre pas sur une chaîne qu'il couvre — le swap se compose en plusieurs sauts, orchestrés comme une seule opération : les deux jambes sont vérifiées avant d'offrir la route, jamais après avoir déplacé les fonds.

Best execution : aussi entre les ponts

Le choix du pont n'est pas une propriété de la paire mais du montant. À chaque devis, les rails cross-chain sont interrogés sur la même somme puis comparés sur le taux net : ce que le marchand reçoit, par unité de source réellement dépensée, frais fixes inclus. C'est cette inclusion qui rend la comparaison honnête — un frais plat n'apparaît pas dans le devis (il sort du float natif de l'exécuteur) et son poids ne dépend que de la taille de l'ordre. Le rail qui a de l'historique on-chain garde la main sur toute égalité et toute incertitude : il se fait déplacer par une mesure, jamais par un chiffre manquant.

Le coût de chaîne fait partie du prix

Sur Tron, le coût dominant d'un paiement n'est pas le spread du rail mais l'énergie brûlée par le wallet — et l'énergie est une propriété de la forme de la transaction, pas de son montant. Un dépôt qui se réduit à un transfert ne touche aucun contrat ; passer par un routeur déclenche la pénalité d'énergie dynamique du contrat USDT. D'où une règle de routage assumée : sur cette chaîne, c'est la forme qui décide, pas la taille de l'ordre. Même raisonnement côté Solana, où le pont par défaut price mal le coin natif et ajoute un frais plat que son devis ne montre pas.

Rien ne part avant que la caisse soit vérifiée

La passerelle de custody enregistre un paiement raté sous l'identifiant du retrait, puis refuse tout paiement ultérieur portant cet identifiant : demander trop tôt ne coûte pas la tentative, ça coûte le retrait. Le solde est donc lu avant chaque envoi, et un solde illisible compte comme insuffisant — une passerelle injoignable répond « 0 », ce qui ne doit jamais se lire comme un wallet vide. Trop court, le retrait est mis en attente plutôt qu'échoué : rien n'est envoyé, l'inbox ops est prévenue (seul un humain peut recharger un wallet chaud) et une tâche le repropose chaque minute, le plus ancien d'abord, jusqu'à ce que les fonds arrivent.

Conçu pour être audité

DRY_RUN par défaut (l'exécuteur log la route complète sans rien signer), retry/backoff sur tout ce qui est transitoire mais jamais sur un envoi on-chain, Sentry pour les erreurs, et un état des providers qui distingue explicitement ce qui a été testé en réel on-chain de ce qui ne l'a pas été.

# flux d'un retrait marchand

backoffice · couche 1 executor · couche 2 on-chain
poll withdrawals · secret partagé
claim atomique {processing}
/fund · funding JIT + buffer
solde vérifié, puis attente des fonds…
/broadcast · txid ancré AVANT diffusion
swap exact-output · best execution
sweep du reliquat → collecteur
résultat {completed | rejected}

jupiter Solana · livraison SPL directe

evm v3/v4 best-exec DEX · Permit2

thorchain LTC · DOGE · XRP · BCH · ATOM natifs

debridge EVM ↔ EVM/SOL · ordre livré ~15 s

symbiosis TRON · chaînes mal desservies ailleurs

omniston TON → EVM · escrow HTLC · multi-sauts

near-intents sources EVM · Tron · Solana · ADA/SUI/XLM

flux et providers réels — extraits de la documentation du repo

~/blockchain/chains

Plus de vingt chaînes intégrées ou opérées.

Un processeur d'encaissement dédié par chaîne, un socle EVM générique pour aller vite sur les suivantes — et les stablecoins USDC, USDT et PYUSD sur leurs réseaux respectifs.

Bitcoin + LightningEthereumSolanaSuiBaseArbitrumOptimismPolygonAvalancheBNB ChainCronosHyperliquidSeiTONCardanoTronLitecoinDogecoinBitcoin CashMoneroXRP Ledger
orchestration
Kubernetes — chaque brique conteneurisée, charts Helm, GitOps
supervision
VictoriaMetrics · Prometheus — sync des nœuds, latence RPC, alerting
sécurité
Wallets isolés du plan API, secrets chiffrés, dry-run avant tout on-chain
référence
Le tout en production sur abyxo.app, passerelle de paiement multi-chain

Vous montez un produit ? Parlons infrastructure.

Nœuds, endpoints RPC/gRPC, encaissement, payouts : je conçois, je déploie et j'opère — vous vous concentrez sur le produit.