Sécurité
Revue de sécurité
Une revue interne du code source des contrats. Aucun tiers n’a encore audité les contrats, et cette page ne remplace pas cet audit.
Ce qui a été examiné
Le code source de l’Exchange et de son module d’administration, les bibliothèques qu’il lie, la logique des ordres, des paiements et des liquidations, les dépôts et les retraits, les clés de session, l’exécuteur par lots, les proxys de dépôt, le staking, le jeton et ses récompenses. Le code a été lu tel qu’il est au commit e456c4d (2026-11-06). Les services hors chaîne, les applications et les scripts de déploiement étaient hors du périmètre.
Résultat
La revue n’a trouvé aucun défaut de gravité critique ou élevée dans le code des contrats. Chaque chemin qui déplace des fonds a été lu ligne par ligne et a tenu. Le code ajouté le plus récemment (le staking, le jeton et la clôture depuis le wallet) est celui qui a reçu le moins de revue ; il a été lu en entier, et la comptabilité du staking a en plus été testée comme décrit plus bas.
Ce qui a tenu
- Contrôle d’accès. Toute fonction qui modifie l’état vérifie son appelant avant de rien changer. Le module d’administration ne peut pas être utilisé seul. La propriété ne peut pas être abandonnée, et seul le propriétaire peut mettre à niveau un contrat.
- Signatures. Les messages typés portent la chaîne et le contrat vérificateur, rejettent les signatures malléables, n’utilisent chaque nonce qu’une fois et seulement après la vérification de la signature, et expirent. Une clé de session ne peut pas signer un message réservé au wallet, le wallet ne peut pas signer un trade, et la révocation de toutes les clés d’un coup fonctionne.
- Flux de valeur. La comptabilité entre la trésorerie du pool, le pool suivi, la file de paiements et le seau latéral reste cohérente. Il n’y a pas d’arithmétique non vérifiée, les conversions vers des types plus étroits sont contrôlées et chaque arrondi va dans le sens que fixe la conception. Les frais sont plafonnés, et un retrait réduit le solde avant que l’action Hyperliquid ne soit envoyée.
- Réentrance. Toute fonction qui déplace des fonds est protégée contre la réentrance, et l’état est écrit avant les appels externes. Le hook du jeton s’exécute avec une allocation de gas fixe, si bien qu’un appelant ne peut pas forcer son report.
- Adresses de dépôt. Un proxy de dépôt ne peut envoyer des actions HyperCore que par l’Exchange, et son propriétaire n’en peut retirer que des jetons EVM et du HYPE natif. La dérivation de l’adresse n’a pas changé.
- Motifs de code. Pas de
selfdestruct, detx.origin, de.transfer, de.sendni decallcode. Les seuls delegatecall vont vers le module d’administration et les bibliothèques liées. - Le jeton qui brûle. BACK est staké dès son émission et brûle 7 jours plus tard, au minuit UTC suivant. Rien ne commence à décompter avant que le LP comptable ait atteint $500,000 pour la première fois. Le jour d’expiration de chaque lot, le parcours paresseux des lots d’un compte, le calendrier global, les mints rejoués et le début du compte à rebours sont conformes à cette conception, que décrit Récompenses et réclamation.
Comment la comptabilité du staking a été testée
Un modèle séparé a été écrit à partir des seules règles publiées, sans lire l’arithmétique du contrat. Des séquences aléatoires de mints (avec des rejeux tardifs), le début du compte à rebours, des distributions, des réclamations et des sauts dans le temps (jusqu’à une seconde avant minuit, exactement minuit, par jours, et jusqu’à 150 jours d’inactivité) ont été exécutées sur le contrat et sur le modèle, et comparées après chaque étape. Sur 76,800 appels, et 38,400 de plus avec de longues pauses, il n’y a eu aucune différence : les soldes vivants et l’offre ont coïncidé exactement, les récompenses ont coïncidé aux poussières d’arrondi près, aucun compte n’a pu réclamer plus que ce qui était mis de côté, et chaque réclamation a versé exactement le montant en attente. Deux bogues ajoutés exprès ont été détectés.
Constats
| Gravité | Constat | Statut |
|---|---|---|
| Moyenne (assurance) | Les analyseurs statiques et les fuzzers (Slither, Aderyn, Medusa, Echidna, Halmos, Gambit) ont tourné pour la dernière fois avant la réécriture du jeton. Le nouveau code dispose de la suite de tests, de la campagne d’invariants à sa durée par défaut et du modèle ci-dessus. | À relancer avant l’audit externe. |
| Moyenne (conception, divulguée) | Au lancement, toutes les protections de prix sur la chaîne sont désactivées : les exécutions utilisent le milieu du meilleur prix acheteur et vendeur brut d’Hyperliquid, avec un levier élevé. La protection vient des limites du relayer, des keepers et de la sentinelle, le tout hors chaîne. | Divulguée ; voir Risques. |
| Faible | Le consentement aux frais de builder d’une clé de session n’est pas effacé quand la clé est enregistrée de nouveau avec l’ancien type de signature, ni quand elle est révoquée ; un builder désigné plus tard pourrait donc gagner jusqu’au taux consenti auparavant. Le plafond des frais de builder le borne. | À corriger avant le déploiement en production. |
| Faible | La file des mints différés ne permet pas de sauter une entrée. Si une entrée échouait à chaque rejeu, les mints suivants attendraient derrière elle. Un changement des coûts de gas sur HyperEVM, ou un bogue dans une future mise à niveau, pourrait en être la cause. | La reprise passe par une mise à niveau via le timelock. |
| Moyenne (économique, divulguée) | Depuis le 2026-11-08, une perte émet sur toute sa base d’émission : les gains ne se compensent pas avec les pertes suivantes et aucun plafond ne limite un compte. Un trader peut tenir des positions opposées et émettre sur la jambe perdante quoi que fasse le marché. Cette revue a lu le code avant ce changement. |
Divulgué. Les frais, le brûlage après le compte à rebours et la part que prennent les autres jetons vivants à chaque distribution en sont les seuls freins ; voir Risques. |
| Faible | Le gardien peut suspendre le trading, retirer un marché définitivement, remplacer le keeper de marché et le keeper hors horaires, autoriser ou retirer des relayers, et relever l’allocation de gas des lectures de prix. Il ne peut ni déplacer des fonds ni lever la suspension. | Voulu ; voir Risques. |
| Info | Le solde et l’offre du jeton sont exacts à tout moment, mais l’événement d’un jeton brûlé n’est enregistré que lorsque le compte est touché de nouveau ; les outils qui additionnent les événements affichent donc les jetons brûlés comme vivants. | Lisez les soldes, pas les événements. |
| Info | Calendrier des récompenses : un mint juste avant une distribution reçoit une part au prorata, le premier détenteur prend ce qui n’était pas alloué et, après une longue inactivité, les lots expirés se partagent les distributions faites entre-temps. Il n’est jamais versé plus que ce qui a été distribué. | Documenté ; solvable lors des tests. |
| Info | La chaîne de version de l’Exchange indique une version plus ancienne que celle de son interface. | À corriger avant le déploiement en production. |
| Info | Une fonction du proxy de dépôt n’est jamais appelée. | Conservée, car le code du proxy fixe chaque adresse de dépôt. |
| Info | Le propriétaire peut créditer un compte avec un excédent d’Hyperliquid que personne n’a réclamé. | Une hypothèse de confiance ; derrière le timelock en production. |
Ce qui n’a pas été couvert
- Les contrats lens en lecture seule, la bibliothèque d’administration des marchés et la bibliothèque des bornes ont été survolés, pas relus ligne par ligne.
- La suite de tests complète, ainsi que les contrôles de la disposition du stockage, de l’interface, de la taille des contrats et du code du proxy de dépôt, n’ont pas été relancés pour cette revue. Les résultats de la dernière exécution complète ont servi de base.
- Les tests sur fork contre Hyperliquid, les scripts de déploiement au-delà de leurs contrôles de rôles, les services hors chaîne et les applications.
- La règle d’émission du jeton après le changement du
2026-11-08(sans compensation des gains, sans plafond), le comportement en gas du hook du jeton, et la question de savoir si les précompilés d’Hyperliquid se comportent comme les tests le supposent.
Garder cette page honnête
Ceci est une revue à un moment donné. Elle ne dit rien des changements faits aux contrats après le commit ci-dessus. Les contrats sont évolutifs derrière un timelock : ce qui est déployé à un instant donné doit donc être vérifié avec les adresses des contrats.