Gestion automatisée de liquidité concentrée cbBTC/USDC · Base mainnet
Mémorisé dans votre navigateur uniquement. Le RPC public Base (mainnet.base.org) est limité — un endpoint dédié (Alchemy, Infura…) est recommandé.
Trois vaults sur la même pool cbBTC/USDC, qui ne diffèrent que par la largeur de leur range. Les boutons remplissent le champ — le reste (pool, gauge, décimales, ordre des tokens, et la plage réelle) est lu sur le contrat à la connexion, donc un libellé ne peut pas se désynchroniser de la réalité.
Une actualisation complète coûte ~35 appels RPC. Sur un forfait limité en débit (Alchemy free : 330 CU/s), un intervalle court peut déclencher des erreurs de quota — 5 min est un bon compromis. Les actualisations ne se chevauchent jamais : le prochain cycle ne démarre qu'une fois le précédent terminé.
Sert uniquement à écrire l'historique des actions owner dans dashboard/history/*.json (aucun autre usage). Créez un fine-grained personal access token sur GitHub, limité à ce seul dépôt avec la permission Contents: Read and write. Mémorisé dans votre navigateur uniquement, jamais envoyé ailleurs qu'à api.github.com.
Horizon : semaines et mois. Le verdict porte sur les 30 derniers jours, calculé sur bougies journalières. La ligne « tendance de fond » sous le verdict donne l'horizon long (mois/années) — les deux répondent à des questions différentes et peuvent diverger sans se contredire. Exemple relevé le 13/08 : marché baissier sur l'année (prix à −12 % sous l'EMA200 journalière) mais en range depuis un mois. Chacun pris seul serait trompeur.
Les deux mesures les plus lisibles sont les plus simples. Un prix qui repasse 7 fois au-dessus et en dessous de sa moyenne mobile en 30 jours oscille, il ne tend pas — aucun indicateur composite ne dira mieux. Et le R² d'une régression linéaire dit directement quelle part du mouvement une tendance explique : à 0,13, c'est du bruit ; au-delà de 0,5, c'est une vraie direction.
Ce que valent vraiment ces indicateurs, mesuré sur nos propres backtests (2018-2026, BTC et ETH) — parce qu'un tableau de bord qui affiche des chiffres sans dire ce qu'ils pèsent invite à leur faire trop confiance.
EMA200 journalière (ligne de fond) est le seul indicateur qu'on ait validé : 46 % d'exactitude contre 45 % requis pour être rentable, 33 % au hasard. C'est faible, mais positif — et c'est le meilleur de tous ceux qu'on a testés.
ADX mesure la force, jamais la direction. ⚠ Nuance importante : le résultat qu'on a validé (p < 0,005 sur BTC et ETH) portait sur l'ADX en 4 h, avec une sortie bornée à une semaine. À l'horizon journalier affiché ici, l'ADX n'a pas été validé. Il est présent parce qu'une direction sans force ne veut rien dire, pas parce qu'on a mesuré son efficacité à cette échelle.
Croisements et R² ne sont pas des signaux d'entrée ou de sortie : ce sont des descripteurs de régime, non testés comme stratégie.
Volontairement absents : le RSI (29 % d'exactitude — pire que le hasard dans les deux régimes) et le momentum 12 semaines (38-40 %, sans valeur). Les afficher donnerait du crédit à des signaux qu'on a mesurés comme nuisibles.
⚠ Ce verdict est une aide à la lecture, pas une recommandation. Dans tous nos tests, sortir sans plan de retour a perdu : le seul protocole gagnant imposait de rentrer au bout d'une semaine maximum.
Utilité : réclame les AERO accumulés par la gauge, les convertit en USDC et les réinjecte dans le vault : d'abord dans la réserve tant qu'elle est sous sa cible, ensuite dans la position elle-même. La position n'est jamais fermée.
Comment : wallet owner. Refusé s'il n'y a rien à réclamer, ou si le prix spot s'écarte trop du TWAP.
À savoir : rien ne part vers ton wallet — c'est un réinvestissement, pas un retrait. Le keeper le fait déjà automatiquement une fois par jour ; ce bouton sert à le déclencher à la main.
À quoi ça sert : 10 % du dépôt reste en USDC, jamais exposé à l'impermanent loss. À chaque recentrage, le contrat y puise de quoi ramener la position à sa valeur de référence — celle qu'elle avait avant de sortir du range.
Ce que ça ne fait pas : ça n'annule pas l'IL, ça la déplace. La position remonte, mais le total (position + réserve) a baissé d'autant. Le dispositif ne gagne que si les AERO rechargent la réserve plus vite qu'elle ne se vide.
Comment la surveiller : une réserve qui décroît d'un recentrage à l'autre sans jamais remonter est le signal que les récompenses ne couvrent plus le coût du churn.
Un APR ne veut rien dire sans la plage : la gauge ne récompense que la liquidité au tick actif, donc le rendement se dilue à peu près en 1/largeur. L'APY publié par DefiLlama porte sur le pool et correspond à une concentration bien plus serrée que la nôtre — les deux ne sont pas comparables.
Ce relevé sert un arbitrage précis : d'après le backtest, élargir la plage gagne tant que cet APR reste sous ~120 %, et la conclusion s'inverse au-dessus. Écrit chaque lundi par un job en lecture seule.
APR instantané = rewardRate × part de liquidité / valeur position. C'est le chiffre mesuré, entièrement calculé depuis la chaîne — le plus fiable de ce panneau.
Frais = 0 tant que la position est stakée. Sur Aerodrome Slipstream c'est AERO ou frais, jamais les deux : les frais de swap d'une position stakée partent dans le gaugeFees() du pool, puis aux votants veAERO. Vérifié sur la chaîne — NPM.collect() renvoie 0/0 sur notre position pendant que earned() monte.
APR moy. 30 j = moyennes DefiLlama du pool (30 j) × ton facteur de concentration (ta position sur ±5,0 % capte plus par dollar que la moyenne du pool). ⚠️ Seule la part AERO te revient : la composante « frais » de DefiLlama décrit le pool entier, elle va aux votants veAERO tant que la position est stakée.
Ce facteur est lissé sur 7 jours (8 relevés). C'est indispensable : stakedLiquidity() ne renvoie que la liquidité du tick actif, et elle double ou reprend de moitié dès que le prix franchit une borne de tick — mesuré 3,75e12 → 7,99e12 → 4,88e12 en quelques heures le 24/07. Sans lissage, ce chiffre variait d'un facteur 2 d'une visite à l'autre sans que rien n'ait bougé sur 30 jours. Le lissage exige un RPC archive ; à défaut le sous-titre indique « concentration instantanée » et la valeur redevient bruitée.
⚠ C'est un chiffre hypothétique, pas un historique : il répond à « si ma position actuelle avait existé ces 30 derniers jours, qu'aurait-elle rapporté ? ». Or elle est plus récente que ça. Il suppose aussi de rester dans le range tout du long — hors range, tu ne captes ni frais ni AERO. La projection à 1 mois en découle et hérite donc des mêmes réserves : à lire comme un ordre de grandeur optimiste, pas comme une prévision.
⚠⚠ Tous ces APR sont BRUTS : ils ne déduisent aucune perte. Ni l'impermanent loss subie quand le prix bouge, ni — et c'est le poste dominant — celle figée à chaque recentrage. Sortir du range fait subir l'IL ; recentrer la verrouille, alors qu'un retour du prix l'aurait effacée. Le backtest sur 2 ans donnait −0,5 %/an en position figée contre −77 %/an en position recentrée souvent : à rendement brut identique, le résultat net n'a rien à voir. C'est précisément ce que le délai de 7 jours et le retrait du recentrage périodique servent à limiter.
Les chiffres nets sont dans « Performance vs HODL » (panneau Fonds totaux), qui inclut tout — frais, AERO, IL passive et IL réalisée. Il donne deux comparaisons, qui ne répondent pas à la même question :
— la valeur affichée compare à 100 % cbBTC, c'est-à-dire « et si j'avais simplement acheté avec tout mon USDC ? ». C'est la vraie alternative, mais elle mêle l'IL et le fait d'avoir gardé la moitié en stable — un lest qui pèse en marché haussier et amortit en baisse ;
— la ligne de détail donne la comparaison à un panier 50/50, référence classique d'un LP : elle neutralise le pari directionnel et isole donc l'impermanent loss. C'est celle qui juge la stratégie de LP elle-même.
Deuxième signal concret : une réserve qui décroît d'un recentrage à l'autre mesure directement l'IL déjà encaissée.
C'est le chiffre qui mesure ce que la stratégie coûte ou rapporte en propre. Il neutralise le pari directionnel — le panier de référence subit exactement le même marché — et ne laisse donc que l'AERO perçu, moins l'impermanent loss figée à chaque recentrage.
Pourquoi il mérite sa propre carte : cette perte n'apparaît dans aucune transaction. Un recentrage ne coûte que ~0,03 $ de gas et un petit swap ; l'IL est un effet de valorisation, jamais un flux. Vérifié on-chain sur les rebalances réels du vault. Si tu ne regardes que tes transactions, elle est invisible.
Après une sortie automatique, les fonds ne partent pas chez l'owner : ils sont
consolidés en USDC dans le contrat et y attendent. Le vault se remet en position tout seul
(reenter(), proposée par le keeper) une fois deux conditions réunies :
la TVL du pool au moins à 95 % de son niveau
au moment de la sortie — autrement dit le pool ne se vide plus — et un délai de décantation
de 24 h écoulé.
C'est un critère de non-dégradation, délibérément pas un retour au niveau d'avant le
crash : un pool durablement plus petit reste parfaitement utilisable, et exiger un niveau historique
condamnerait le capital à dormir en USDC indéfiniment. Ce que ce critère bloque, c'est la re-entrée
au milieu d'un effondrement encore en cours, qui ferait ressortir 24 h plus tard en figeant
de l'IL à chaque aller-retour.
La profondeur, elle, est garantie directement et à chaque entrée : par la liquidité
minimale exigée ci-dessus, et par le minOut à 0,1 % que porte chaque swap.
Une sortie manuelle (retrait, urgence) envoie bien les fonds à l'owner et n'arme aucun retour.
Récupérer l'ETH du wallet keeper (ex : avant un changement de keeper). Nécessite de connecter le wallet keeper lui-même (importe sa clé privée comme compte secondaire dans Rabby/MetaMask puis sélectionne-le) — le dashboard ne stocke jamais cette clé.
Les dates sont mémorisées dans ce navigateur uniquement (comme le RPC et le jeton GitHub) — elles ne sont ni envoyées ni publiées. Sur un autre appareil, les cases seront vides.
Chaque action écrit son entrée d'historique immédiatement (keeper : commit direct depuis GitHub Actions ; owner : via l'API GitHub ci-dessous). Ce bouton sert uniquement de filet de sécurité pour rattraper un événement qui n'aurait pas été écrit (ex : action effectuée hors dashboard/keeper) :
Montant retirable sur ton wallet owner, pas la position LP. Après un dépôt, regarde « Fonds totaux » et « Valeur totale estimée ».
Utilité : met tes USDC au travail. Le contrat met d'abord 10 % de côté en réserve USDC (jamais exposée à l'impermanent loss), swappe la moitié du reste en cbBTC, ouvre une position LP à ±5,0 % autour du prix, et la stake dans la gauge (elle génère alors des récompenses AERO).
Comment : connecte le wallet owner, saisis un montant, puis valide 2 transactions (autorisation USDC, puis dépôt).
Si une position existe déjà : elle est agrandie, pas reconstruite — mêmes bornes, aucune sortie, donc aucune impermanent loss figée. Plus besoin de retirer avant d'ajouter des fonds.
Refusé si : le contrat est en pause, ou le prix spot s'écarte trop du TWAP (garde anti-manipulation → réessaie plus tard).
Unstake → retire la liquidité → swap cbBTC→USDC (0.1% slippage) → envoie tout à l'owner.
Utilité : sortir complètement de la position et récupérer tout en USDC sur ton wallet owner. C'est la voie normale de sortie : slippage serré (0,1 %), donc tu ne brades rien.
Comment : connecte le wallet owner et clique. Les récompenses AERO en attente sont réclamées et converties au passage.
Refusé si : le prix spot s'écarte trop du TWAP (protection anti-manipulation). Dans ce cas, réessaie plus tard — ou utilise le retrait d'urgence si tu dois vraiment sortir tout de suite.
Même logique mais avec 5% de slippage toléré. Pour les marchés très volatils.
Utilité : sortir quand le retrait normal échoue — typiquement en forte volatilité, où la tolérance de 0,1 % est trop serrée. Fonctionne même si le contrat est en pause.
Comment : wallet owner. À n'utiliser qu'après un échec du retrait normal.
Le coût : tu acceptes jusqu'à 5 % de slippage. Sécurité : si le prix spot est manifestement manipulé (écart au TWAP), le contrat ne brade pas ton cbBTC — il te l'envoie tel quel, à convertir toi-même plus tard.
Récupère ton cbBTC et ton USDC bruts, sans rien vendre.
Utilité : le filet de dernière ligne. Retire la position et t'envoie les deux cryptos telles quelles, sans aucun swap. Fonctionne quel que soit l'état du contrat ou du marché (même en pause) et ne dépend pas du Router de swap.
Comment : wallet owner. À utiliser quand tu veux garder tes cryptos plutôt que de tout convertir en USDC, ou si les autres retraits sont bloqués.
Différence : contrairement au retrait normal/d'urgence qui convertissent le cbBTC en USDC, ici rien n'est vendu — le cbBTC arrive brut sur ton wallet. Une éventuelle poussière restante est récupérable via « Récupérer le token ».
Bloque les dépôts et les rebalancements. Le retrait d'urgence reste actif.
Utilité : gel préventif, le temps d'analyser une situation douteuse. Tes fonds restent accessibles : le retrait d'urgence fonctionne toujours en pause.
Comment : wallet owner. Le bouton bascule (pause ↔ reprise) selon l'état courant.
À savoir : une pause manuelle (la tienne) ne se lève jamais toute seule — il faut recliquer. C'est différent d'une pause posée automatiquement par le circuit breaker, qui se lève d'elle-même dès que le marché redevient sain.
Utilité : remplacer le wallet keeper (clé suspectée compromise, ou simple rotation). Rappel : le keeper est à bas privilège — il ne peut jamais envoyer les fonds ailleurs qu'à l'owner. Le remplacer est donc peu risqué.
Comment : wallet owner + adresse du nouveau keeper.
À ne pas oublier ensuite (pas faisable depuis ce dashboard) : mettre à jour le secret GitHub KEEPER_PRIVATE_KEY (Settings → Secrets) avec la clé du nouveau keeper, sinon les crons continueront de signer avec l'ancien et seront rejetés. Pense aussi à récupérer l'ETH de l'ancien keeper via « Vider l'ETH du keeper » plus haut, avant de le remplacer.
Utilité : plancher de sécurité — le contrat refuse dépôt et rebalance si la liquidité de la pool passe sous ce seuil, pour ne pas opérer dans un marché devenu trop mince. 0 = désactivé.
Comment : wallet owner, valeur en unités brutes de liquidité Uniswap V3/Slipstream (le L de ICLPool.liquidity()) — ce n'est ni un montant en USDC/cbBTC, ni un montant en dollars directement. Sa valeur en dollars dépend du prix courant : utilise l'« Équivalence » ci-dessus (recalculée à chaque rafraîchissement) pour convertir, ou compare directement à la « Liquidité actuelle du pool ».
⚠ Attention : une valeur trop élevée bloquerait en permanence les dépôts et les rebalances. Reste bien en dessous de la valeur actuelle (elle varie naturellement avec le prix). En cas de doute, remets 0.
Active ou désactive la sortie automatique si la TVL du pool chute de ≥30% sur 24h.
Utilité : autorise le contrat à liquider tout seul la position si la TVL réelle de la pool s'effondre (≥ 30 % vs le snapshot ~24 h, indépendamment du prix), confirmé après 1 h pour éviter les faux positifs. C'est ton parachute si la pool meurt pendant que tu dors.
Où vont les fonds : ils sont consolidés en USDC et restent dans le contrat — pas de rapatriement vers ton wallet. Le vault se remet en position tout seul quand le pool est réellement retabli (voir « Retour automatique en position » ci-dessus). Seul le repli de dernier recours, quand le Router de swap est indisponible et qu'aucune consolidation n'est possible, envoie les fonds bruts à l'owner.
Comment : wallet owner, bouton bascule.
Sécurité : la détection et la pause sont ouvertes à tous, mais la sortie n'est déclenchable que par owner ou keeper — un tiers ne peut donc pas forcer la liquidation de ton vault. Et l'owner reste la seule destination possible de tout retrait, quoi qu'il arrive.
Utilité : ajuste la sensibilité du crash de TVL (baisse de la valeur réelle du pool) sans avoir besoin de redéployer le contrat.
Unité : basis points (centièmes de pourcent) — 10000 = 100 %. Conversion : valeur ÷ 100 = pourcentage. Exemples : 3000 = 30 % (réglage par défaut), 5000 = 50 % (moins sensible), 1500 = 15 % (plus sensible).
Comment : wallet owner, entre la valeur en basis points (pas en %).
⚠ Attention : une valeur trop basse (ex. 500 = 5 %) rendrait le crash TVL hypersensible à la volatilité normale d'un pool ; une valeur trop haute (proche de 10000) le désactiverait de fait.
Utilité : anti-griefing — un crash de TVL doit être confirmé par un second appel après ce délai avant de déclencher pause + sortie, pour qu'une manipulation ponctuelle ne suffise pas.
Unité : secondes. Conversions utiles : 60 = 1 min, 900 = 15 min, 3600 = 1 h (réglage par défaut), 86400 = 24 h.
Comment : wallet owner, entre la valeur en secondes (pas en heures ni minutes).
⚠ Attention : un délai trop court affaiblit la protection anti-griefing (une manipulation transitoire pourrait suffire) ; un délai trop long retarde une vraie sortie d'urgence en cas de crash réel.
Enregistre si le prix est sorti du range. Pas de swap, juste une mise à jour d'état.
Utilité : acte que le prix est sorti du range ±5,0 % et démarre le compteur de 7 jours au bout duquel un rebalance devient possible. Ne déplace aucun fonds.
Comment : owner ou keeper. Normalement inutile : le cron keeper le fait tout seul toutes les 15 min. Ce bouton n'est qu'un déclenchement manuel si tu ne veux pas attendre.
À savoir : le faire manuellement ne raccourcit pas le délai de 7 jours — ça ne fait que lancer le chronomètre plus tôt.
Déclenche le rebalancement immédiatement si le délai est écoulé et le prix hors range.
Utilité : recentre la position à ±5,0 % autour du prix actuel (unstake → retire → puise dans la réserve pour compenser l'IL → rééquilibre 50/50 → remint → restake). Les récompenses AERO en attente sont réclamées et réinvesties au passage.
Comment : owner ou keeper. Normalement automatique (cron toutes les 15 min) : ce bouton ne sert qu'à ne pas attendre le prochain passage.
Échoue si : le prix n'est pas hors range, le délai de 7 jours n'est pas écoulé, le prix est revenu dans le range entre-temps, ou le contrat est en pause.
Vérifie TWAP + liquidité. Peut déclencher le circuit breaker automatiquement.
Utilité : c'est le circuit breaker. Compare le prix spot au TWAP et surveille la liquidité de la pool ; en cas d'anomalie confirmée (15 min pour un écart de prix, 1 h pour un crash de liquidité), il met en pause et peut déclencher la sortie automatique. Il lève aussi tout seul une pause automatique quand le marché redevient sain.
Comment : owner ou keeper. Normalement automatique : le cron l'appelle toutes les 30 min — c'est ce qui protège le vault en continu.
À savoir : contrairement aux autres vérifications, cet appel coûte du gas à chaque fois (ce n'est pas une simple lecture). Il ne revert jamais.
Propose un nouvel owner. Rien ne change tant que le bénéficiaire n'a pas accepté (étape 2). Permet de faire tourner une clé compromise ou de migrer vers un multisig.
Utilité : ta porte de sortie si la clé owner est compromise, ou pour migrer vers un multisig. Sans ça, une clé owner perdue rendrait les fonds inaccessibles à jamais (l'owner est la seule destination possible).
Comment : wallet owner + adresse du bénéficiaire → puis le bénéficiaire doit accepter (carte de droite). Le transfert n'est effectif qu'à ce moment-là.
Pourquoi 2 étapes : ça évite de transférer vers une adresse inaccessible (faute de frappe, contrat sans code) — une erreur irréversible.
Annuler : propose l'adresse nulle (0x0000…0000) tant que le bénéficiaire n'a pas accepté.
À exécuter depuis le wallet bénéficiaire (celui proposé à l'étape 1). Il devient alors owner : toutes les fonds et tous les droits le suivent.
Utilité : finalise le transfert. Tant que ce bouton n'a pas été cliqué par le bénéficiaire, rien ne change — l'owner actuel garde tout.
Comment : déconnecte le wallet owner et connecte ici le wallet bénéficiaire (celui affiché dans « Transfert en attente »), puis clique. Tout autre wallet sera rejeté par le contrat.
Effet immédiat : l'ancien owner perd tous ses droits, et les futurs retraits/rescue iront vers le nouveau. Vérifie bien que tu contrôles ce wallet.
Retire le NFT de la gauge sans toucher à la liquidité. À n'utiliser que si le retrait normal est bloqué.
Utilité : première marche de l'échappatoire, si le pipeline habituel casse (bug de la gauge, du Router…). Découple ta position de la gauge sans dépendre d'un swap.
Comment : wallet owner. C'est le préalable obligatoire à « Récupérer le NFT ».
Conséquence : la position ne génère plus de récompenses AERO tant qu'elle est unstakée. Ce n'est pas une sortie : ta liquidité reste dans la pool.
Envoie le NFT de position brut à l'owner, sans retirer la liquidité ni swapper. Tu géreras la position à la main (Aerodrome/Basescan). Nécessite d'avoir unstake avant.
Utilité : le dernier recours — il sort ta position du contrat sans dépendre d'aucun swap ni du Router. Même si tout le reste est bloqué, tu récupères la propriété de ta liquidité.
Comment : wallet owner, et uniquement après « Unstake manuel » (sinon le contrat refuse).
Après ça : le contrat n'a plus de position (il redevient vide, prêt pour un nouveau dépôt) et tu détiens le NFT sur ton wallet. Tu devras retirer la liquidité toi-même depuis l'interface Aerodrome ou Basescan.
Envoie un token quelconque du contrat vers l'owner (poussière cbBTC/AERO, token envoyé par erreur…).
Utilité : récupérer ce que le pipeline normal laisse derrière — poussière cbBTC/AERO sous le seuil de 1 USDC (jamais balayée par un retrait), ou un token envoyé par erreur au contrat.
Comment : wallet owner + adresse du token + montant en unités brutes (pas en décimales) : pour l'USDC (6 décimales) 1 USDC = 1000000 ; pour l'AERO (18 décimales) 1 AERO = 1000000000000000000.
Sans risque de détournement : la destination est codée en dur sur l'owner — impossible d'envoyer ailleurs, même par erreur.
Ne marche pas pour l'ETH : utilise « Récupérer l'ETH » ci-dessous à la place.
Envoie tout l'ETH détenu par le contrat vers l'owner.
Utilité : le contrat n'utilise jamais l'ETH lui-même (uniquement des tokens ERC20) — cette fonction récupère un solde accidentel (envoi direct, ou envoi forcé via selfdestruct d'un autre contrat, qui contourne même l'absence de logique de réception).
Comment : wallet owner, aucun paramètre — envoie la totalité du solde ETH du contrat.
Sans risque de détournement : la destination est codée en dur sur l'owner, comme les autres fonctions rescue.
À ne pas confondre : ceci concerne l'ETH du contrat (normalement toujours à 0). Pour l'ETH du wallet keeper, utilise « Vider l'ETH du keeper » plus haut.
…