Fonctionnement en détail
Prix : la précompilée BBO
L’Exchange lit les prix directement dans le carnet d’ordres d’Hyperliquid via une précompilée EVM. Pas d’oracle off-chain, pas de bot de prix, pas de signataire de prix.
Implémentation technique de la précompilée BBO
Un exchange de perpétuels a besoin de prix pour deux tâches : exécuter les trades et décider quand les positions sont liquidées. Sur la plupart des chaînes, cela signifie faire confiance à un opérateur d’oracle, ou à un flux décentralisé lent et coûteux, ou accepter le risque que celui qui publie les prix puisse geler le marché en arrêtant simplement de le faire.
HyperEVM offre une autre voie. HyperCore, la couche qui fait tourner les carnets d’ordres d’Hyperliquid, peut être lue depuis les contrats HyperEVM via des précompilées de lecture : des contrats système à adresse fixe qui renvoient l’état en direct de HyperCore, prix compris. L’Exchange utilise la précompilée BBO à l’adresse 0x000000000000000000000000000000000000080e. À partir d’un index d’actif Hyperliquid (sur le mainnet, BTC est 0 et ETH est 1), elle renvoie le meilleur prix acheteur et le meilleur prix vendeur actuels de ce perpétuel :
(ok, bid, ask) = HyperCore.readBbo(assetIndex, precompileGas) // a static call with a fixed gas allowance
require(ok && bid != 0 && ask != 0 && ask >= bid) // an empty or crossed book reverts
Le prix d’exécution est le point médian, arrondi à l’inférieur, dans les unités de prix brutes du marché (le prix Hyperliquid multiplié par une échelle propre au marché) :
price = (bid + ask) / 2
C’est toute la chaîne de calcul du prix. Toutes les lectures d’un bloc voient le même instantané, et l’Exchange met en cache le prix de chaque marché pour le reste de l’appel, si bien que chaque ouverture, clôture et liquidation d’un marché dans un bloc utilise le même prix.
Ce qu’on y perd, et ce qu’on y gagne
Le coût est simple : seuls les marchés déjà négociés dans le carnet d’Hyperliquid peuvent être listés. Rien de ce qu’Hyperliquid ne liste pas ne peut être tradé ici.
En échange, le calcul du prix n’a aucune partie off-chain. Le BBO fait partie de l’état de HyperCore, validé par le consensus d’Hyperliquid comme les soldes de son registre. Il n’y a ni signataire de prix ni comité d’oracles ; le prix que voit l’Exchange est celui que cotent les teneurs de marché d’Hyperliquid dans ce bloc, lisible par n’importe quel contrat.
Pas de coupe-circuit sur les écarts
Quelqu’un peut tenter de faire bouger le carnet d’Hyperliquid le temps d’un bloc, en élargissant le spread ou en déplaçant les meilleures cotations, et trader ici contre le prix médian faussé. C’est un vrai risque de l’usage direct du BBO.
Une lecture fait échouer le trade quand la précompilée ne répond pas, quand l’un des deux côtés du carnet est à zéro ou quand le carnet est croisé ; un carnet bloqué, avec l’achat égal à la vente, est accepté. Les contrats contiennent aussi des garde-fous de prix : un spread maximal, et des bandes qui comparent le prix médian aux prix de marque et oracle d’Hyperliquid. Ils sont désactivés dans la configuration déployée, qui garde volontairement les exécutions au prix médian brut, si bien qu’un carnet manipulé mais non nul et non croisé est accepté. La zone morte, la courbe d’impact, les plafonds d’intérêt ouvert par côté et la courte retenue du relayer sur les clôtures de positions toutes récentes (6 secondes) réduisent certains gains et limitent l’exposition ; ils ne rendent pas la manipulation non rentable et ne bornent pas la perte du LP. Voir Risques.
Le seul levier en temps réel : retirer un marché
Une seule action d’administration sur les prix prend effet immédiatement : le retrait d’un marché. Le gardien appelle pauseMarket(instrumentId), qui enregistre le BBO actuel comme prix acheteur et prix vendeur figés et marque le marché comme retiré. Dès lors :
- les nouvelles ouvertures sur ce marché sont rejetées ;
- les clôtures et les liquidations fonctionnent toujours, au carnet figé plutôt qu’au carnet en direct.
Le retrait est définitif : personne, pas même le propriétaire, ne peut rouvrir cet identifiant de marché. Si un marché retiré pouvait revenir, les détenteurs pourraient choisir entre le prix figé et le prix en direct ultérieur, et le moment de la réouverture deviendrait lui-même exploitable. Si le marché revient, il est listé de nouveau sous un nouvel identifiant. Le prix figé permet d’arrêter un marché sans bloquer ses positions : elles peuvent toujours être clôturées à un prix qui avait du sens au moment de l’intervention. Le retrait se fait marché par marché, donc un problème sur un actif n’arrête pas les autres.
Si le carnet lui-même est inutilisable ou peu fiable à ce moment-là, le gardien peut plutôt retirer le marché au prix de marque ou au prix oracle d’Hyperliquid (retireMarket avec cette source) ; une lecture BBO qui échoue se rabat automatiquement sur le prix de marque. Le gardien peut aussi suspendre le trading sur tous les marchés avec setTradingPaused(true), sans figer les prix : les clôtures et les liquidations continuent d’utiliser le carnet en direct, et seul le propriétaire peut lever la suspension.
En dehors des plafonds d’intérêt ouvert et des minimums de trade du keeper de marché, du choix du keeper hors heures entre les deux courbes de paiement et du retrait d’un builder par le multisig de gouvernance, toutes les autres actions d’administration (frais, paramètres d’impact, listings, keepers, mises à niveau) sont des actions du propriétaire qui passent par le timelock.