SSRN 7157638 · étude du livre en direct d'Aave v3

Publié · SSRN

Liquidation Without Loss

A Live-Book Decomposition of Aave v3

By

Lu comme un chiffre de perte, le montant à risque d'un livre en boucle surestime sans borne l'exposition d'un protocole de prêt. Cet article sépare les trois quantités qu'un test de résistance confond en une seule, dérive la profondeur à laquelle le volume pourrait devenir une perte, et dimensionne les canaux qui opèrent réellement cette conversion. Tout ce qui suit tourne sur un unique bloc Ethereum en direct : 17 419 emprunteurs, 6,5 Md$ de dette.

Partenaires de données

Bitquery a fourni les journaux d'événements et les énumérations d'emprunteurs, dont le livre Aave v2 antérieur à l'événement utilisé pour le test hors échantillon. CoinGecko Pro a fourni les relevés de prix quotidiens derrière le panier de covariance et les reconstructions d'événements. Les deux ont donné accès à leurs API en tant que partenaires de ce travail.

Ce que l'article établit

LE RÉSULTAT

1,38 Md$ éligible, 0$ perdu

Un décrochage de 5% sur la tranche de liquid staking de 1 437 positions signale 1,38 Md$ comme éligible à la liquidation. Environ la moitié se négocie effectivement, et sur le noyau de boucles pures de 1,357 Md$ que le moteur parcourt, rien de tout cela n'est du capital que le protocole perd.

LE MÉCANISME

LT(1+b) < 1

Quand le seuil de liquidation d'une catégorie multiplié par son bonus reste inférieur à un, une boucle qui franchit HF = 1 est retirée alors que son collatéral couvre encore la dette majorée du bonus. Aave satisfait cette condition dans les huit catégories e-mode actives.

LE LEVIER

Rompre la trajectoire, pas la profondeur

La perte exige un saut de prix discret, un oracle obsolète, ou un pool trop peu profond pour absorber la saisie. La profondeur seule ne la produit pas. Les leviers sont donc les bornes d'oracle et les plafonds d'approvisionnement, pas le seuil de liquidation.

Trois quantités, pas une

Un test de résistance imprime un chiffre et une salle des risques le lit comme une perte. Dans un livre en boucle, ce n'est ni le volume qui se négocie ni le capital que le protocole perd, et les trois se séparent nettement dès que l'on fait parcourir au livre une véritable trajectoire de prix plutôt que de le valoriser à un unique point bas.

La dette éligible est la dette des positions dont le facteur de santé franchit un. Sous un facteur de clôture partiel, une position est liquidée par tranches : un appel remboursxe une fraction de la dette courante, la saisie la ramène au-dessus du seuil, et elle peut franchir de nouveau plus tard. La dette éligible atteint donc environ le double du remboursement exécuté, et dans la grappe en direct aucune position n'est intégralement fermée.

Eligible debt 1356.9 million dollars, executed repayment 691.3 million, seized collateral 720.2 million, protocol bad debt zero.LIVE LOOP CLUSTER · 236 POSITIONS · 5% DE-PEG$1,356.9Mliquidation-eligible debt$691.3Mexecuted repayment$720.2M collateral seizedpar units, not additive with the repayment above$0protocol bad debtLT(1+b) = 0.95 × 1.01 = 0.9595 < 1every loop is removed while its collateral still covers the bonus-grossed debt170 partial-liquidation calls · 0 positions fully closed · close factor 0.5Eligible debt is roughly twice executed repayment, and none of it is capital the protocol loses.
Fig. 1:La grappe de boucles en direct sous un décrochage de 5% : 236 positions, 2,19 Md$. C'est le noyau de boucles pures que parcourt le moteur à trajectoire continue, portant 1 356,9 M$ des 1 381,5 M$ que signale la tranche plus large de 1 437 positions. La dette éligible n'est pas le volume exécuté, et le volume exécuté n'est pas une perte. D'après headline_liveslice.json.

Pourquoi une boucle est couverte contre le choc que tout le monde teste

Une boucle dépose un actif, emprunte un actif corrélé, puis redépose. Le moteur de résistance met à l'échelle le facteur de santé réel on-chain de chaque position par un mouvement pondéré entre collatéral et dette, où chaque u est la valeur en dollars de cette jambe et où le HF₀ on-chain intègre déjà les seuils e-mode du protocole. Écrite comme un rapport, elle suppose que les jambes de collatéral partagent un seuil de liquidation unique, ce qui vaut pour le noyau de boucles pures ; la forme explicite par actif porte le seuil propre de chaque jambe à l'intérieur de la somme de collatéral :

Le mécanisme est visible dans le rapport. Quand la classe du collatéral égale celle de la dette, les facteurs (1 + mouvement) s'annulent et une chute de marché touche à peine le facteur de santé. La boucle survit. Une position directionnelle, dont la jambe de dette en stablecoin reste fixe pendant que son collatéral baisse, encaisse le mouvement en entier.

acquisition/aave_v3_correlated_stress.pypython
def shocked_hf(position, moves):    """Scale the real on-chain HF by a collateral-vs-debt weighted move.     We never re-derive a loan-to-value: HF0 is read from the chain and so    already embeds whichever e-mode liquidation threshold the account selected.    """    coll = sum(u * (1 + moves[a]) for a, u in position.collateral.items())    debt = sum(u * (1 + moves[a]) for a, u in position.debt.items())     coll_w = coll / sum(position.collateral.values())    debt_w = debt / sum(position.debt.values())     return position.hf0 * (coll_w / debt_w)   # liquidatable iff < 1  # A loop holds the same class on both legs, so the move divides out:#     hf0 * (1 + m) / (1 + m) == hf0        -> survives a market crash# A directional position holds a stable debt leg, so it does not:#     hf0 * (1 + m) / (1 + 0) == hf0*(1+m)  -> liquidated
Le facteur de santé après choc. Rien ici ne redérive un ratio prêt-valeur ; le moteur s'ancre sur le facteur de santé réel on-chain afin que les seuils e-mode du protocole se propagent tels quels.

C'est pourquoi le chiffre qu'un tableau de bord uniforme rapporte pour un livre en boucle est une convention de compensation et non une propriété du livre. Face à une salle qui compense correctement, le modèle corrélé et le contraste de même classe concordent à 8% près à chaque sévérité, 0,92× à −5%. Les rapports plus élevés de 6,53× et 9,13× mesurent l'ampleur d'une omission de compensation. Et l'annulation n'est pas un artefact du découpage en classes : mélanger l'appariement collatéral-dette fait chuter le rapport de 9,13× à environ 1,3×, p = 0,0002 sous les deux schémas.

L'invariant qui rend la liquidation sans perte

Une boucle est liquidée selon les paramètres du mode dans lequel elle est détenue, et c'est là qu'une lecture peut se tromper : la grappe en direct se trouve dans l'e-mode corrélé à ETH, dont le bonus de catégorie est de 1%, et non le bonus de 6% de la réserve wstETH. Lu depuis le contrat Pool, le couple est LT 0,95 avec b = 0,01.

Un liquidateur saisissant un collatéral valant le remboursement majoré du bonus est plafonné au collatéral que la position détient encore. Un déficit ne peut donc s'ouvrir qu'une fois que le collatéral cesse de couvrir cette saisie majorée, ce qui donne la condition directement :

À LT 0,95, atteindre le régime de perte au franchissement exigerait un bonus supérieur à 5,26%, cinq fois ce qu'Aave fixe. Chacune des huit catégories e-mode actives se situe entre 0,876 et 0,960, et le couple de la réserve wstETH est à 0,859. Ce n'est pas un équilibre sur le fil, et c'est pourquoi ce 0$ est structurel plutôt qu'un résultat empirique de robustesse.

Liquidation threshold times one plus bonus, by parameter pair, all below the value one.LT(1+b), THE SOLVENT-LIQUIDATION INVARIANT0.850.900.951.001.05LT(1+b) = 1above this line, loss beginsthe instant a loop is liquidatableETH-correlated e-modeLT 0.95 · bonus 1%carries the live loops0.9595Stablecoin e-modeLT 0.92 · bonus 4%0.9568BTC e-modeLT 0.86 · bonus 3%0.8858wstETH reserveLT 0.81 · bonus 6%reserve, not a category0.8586
Fig. 2:Chaque couple de paramètres actif d'Aave se situe sous un, avec de la marge. Quiconque confondrait le bonus de 6% de la réserve avec celui de 1% de la catégorie calculerait 1,007 et conclurait l'inverse.

Où le volume pourrait devenir une perte

L'écart entre volume et perte ne devient exploitable que lorsqu'on peut dire où il s'arrête. Une boucle déposant un collatéral C au seuil LT contre une dette D a un facteur de santé on-chain HF₀ = C·LT/D, et un décrochage de profondeur f déprécie le collatéral face à la jambe de dette maintenue. Deux profondeurs comptent, et le point de rupture est la plus grande des deux :

Le premier terme est l'endroit où le facteur de santé atteint un et où la liquidation devient éligible. Le second est l'endroit où la saisie majorée du bonus ne peut plus être couverte et où la créance irrécouvrable du protocole commence. La perte ne peut pas débuter avant que la boucle soit même liquidable, donc D* est le maximum. En termes de levier, les deux se resserrent à mesure que la boucle s'endette.

acquisition/d_star.pypython
def d_star(leverage, lt, bonus):    """Depth at which a de-peg stops being volume and can become loss.     f_hf   the loop becomes liquidation-eligible  (HF reaches 1)    f_exh  collateral stops covering the bonus-grossed seizure    """    hf0 = lt * leverage / (leverage - 1)     f_hf = 1 - 1 / hf0                       # == 1 - (L-1)/(L*LT)    f_exh = 1 - (1 + bonus) * lt / hf0       # == 1 - (1+b)(L-1)/L     return max(f_hf, f_exh), f_hf, f_exh  # The live ETH-correlated e-mode anchor: ~12x leverage, LT 0.95, 1% bonusd, f_hf, f_exh = d_star(12, 0.95, 0.01)#   f_hf  = 0.0351   eligible at a 3.5% de-peg#   f_exh = 0.0742   loss cannot begin before 7.4%#   d     = 0.0742   -> a 3.9-point band of pure liquidation volume
Le point de rupture en forme fermée. La figure ci-dessous trace directement cette fonction plutôt qu'une copie décalquée, de sorte que la courbe à l'écran est l'équation du texte.

Pour l'ancrage e-mode en direct, à environ 12× de levier, la boucle devient éligible à la liquidation à 3,5% mais ne commence à perdre qu'à 7,4% : une bande de 3,9 points dans laquelle le décrochage ne produit que du flux. La médiane sur la tranche en direct est de 6,9%, et 8,8% pondérée par la dette. La forme fermée reproduit le seuil de déclenchement du moteur de cascade à un pas de grille près, au plus 0,02%, partout où cela a été vérifié.

Breakpoint D-star versus loop leverage for two parameter pairs, with cascade-engine confirmations.D* = max( 1 − 1/HF₀ , 1 − (1+b)·LT/HF₀ )0%8%16%24%32%4×8×12×16×20×loop leverage L = C / (C − D)HF₀ = 1 at 5.26×live e-mode loop · ≈12× · LT 0.95eligible at 3.5% · loss only past 7.4%a 3.9-point band of pure volumee-mode LT 0.95 / 1% bonuswstETH reserve LT 0.81 / 6% bonus (to 5.3×, its HF₀ = 1 ceiling)cascade-engine onset (matches to ≤0.02%)Below the curve a de-peg is pure liquidation-eligible debt. Above it, volume can convert to loss, but only if the continuous path is broken.
Fig. 3:D* en fonction du levier de la boucle pour les deux couples de paramètres actifs, avec les seuils de déclenchement du moteur de cascade superposés. Plus de levier resserre la bande ; l'ancrage e-mode en direct en conserve encore 3,9 points.

Ce qui convertit réellement le volume en perte

Comme chaque boucle active se trouve dans le régime à marge de solvabilité, un décrochage continu plus profond ne convertit pas le volume en perte. La boucle est retirée à son propre franchissement, encore solvable, à n'importe quelle profondeur. Poussée le long d'une glissade continue, la boucle d'ancrage enregistre 0$ de 2% à 20%. Ce qui convertit, c'est une rupture de la trajectoire, et chaque canal peut être dimensionné sur le même moteur.

Le canal qui mord en premier n'est pas le plus spectaculaire. Un saut discret assez large pour franchir la frontière n'enregistre rien avant 8%. La liquidation partielle dans un pool fini enregistre 3,01 M$ à un saut de 5%, là où une liquidation intégrale dans un pool profond enregistre zéro, parce que la position reste sous l'eau sur plusieurs tours pendant que chaque vente forcée déprime le prix pour le suivant. Ce chiffre est une borne supérieure du canal : Aave relève le facteur de clôture à 100% sous un seuil de facteur de santé, et une clôture intégrale unique évite la dépression sur plusieurs tours. L'obsolescence d'oracle mesurée en juin 2022 fait passer un saut de 8% de 0,58 M$ à 5,13 M$ dans la queue d'obsolescence profonde.

python/defi_param_stress/cascade_ref.pypython
# One liquidation call, inside the cascade to a fixed point.# Two caps carry the whole result. # Aave's cap. Note close_factor is promoted to 1.0 below a health-factor# threshold, so the partial-round case below is the worst case, not the only one.repay = position.debt * close_factorseize_value = repay * (1 + bonus)                          # bonus-grossed # A position cannot be seized for more collateral than it still holds,# so a loop liquidated over several rounds never over-seizes.available = position.collateral - position.seizedseized = min(seize_value, available) position.debt -= repayposition.seized += seized # Loss is the residual, and it only opens once the grossed seizure# stops being covered:  bad_debt = D - C(1 - f)/(1 + b)if seized < seize_value:    bad_debt += repay - seized / (1 + bonus) # Selling the seized collateral into a finite x*y=k pool moves the mark# for the next round. With close_factor < 1 the position sits underwater# across rounds, and that is the channel that books loss at gaps a# deep-pool boundary treats as harmless.price *= constant_product_impact(seized, pool_reserves)
L'étape interne du noyau de cascade. Deux plafonds font tout le travail : un appel est limité au facteur de clôture de la dette courante, et une saisie est limitée au collatéral que la position détient encore. La dette résiduelle est ce qui s'enregistre comme perte.
Protocol bad debt per hundred-million-dollar loop, by break channel and severity.BAD DEBT PER $100M LOOP, BY WHAT BREAKS THE PATH (GAP DEPTH, EXCEPT THE LAG ROW)Discrete price gapcf 1.0, deep pool, e-mode LT 0.95$05%$0.58M8%$4.54M12%$12.46M20%$27.31M35%Partial liquidation into a finite poolcf 0.5, $2B pool$3.01M5%$5.51M8%$8.87M12%$15.7M20%Oracle stalenessgap held at 8%, lag varied$0.58Mnone$0.86M+31bp$2.03M+159bp$5.13M+500bp
Fig. 4:Créance irrécouvrable par boucle à l'échelle de 100 M$, selon le canal qui rompt la trajectoire continue. Les deux couples de paramètres tiennent 0$ sur une glissade non rompue, donc tout ce qui apparaît ici provient de la rupture.

La profondeur du marché secondaire fixe l'ampleur et avance le déclenchement : pour une grappe dispersée, le déclenchement passe de 6,05% face à un pool infiniment profond à 2,10% dès que le pool est fini, et la perte réalisée à un saut fixe de 15% monte de 30,2 M$ à 695,7 M$ face à un pool de 1 Md$. Les boucles ne perdent pas parce qu'elles sont liquidées. Elles perdent si le marché dans lequel on les liquide est trop mince pour absorber la saisie.

Quand la vente forcée déplace l'ancrage lui-même

L'objection la plus tranchante à lire 1,38 Md$ comme du volume est qu'elle suppose que la vente s'écoule sans déplacer l'ancrage. Pour un jeton de liquid staking, l'ancrage est un prix de marché secondaire, donc le collatéral déversé déprime précisément le rapport qui le valorise. En bouclant cela de façon endogène sur la grappe en direct, la file de retrait étant gelée, un choc au-delà du déclencheur de 0,19% de la boucle la plus endettée fait descendre l'ancrage à environ 3% du pair, soit un décrochage d'environ 97%.

Même là, le protocole enregistre 0$, parce que chaque boucle est retirée à son propre franchissement solvable avant que l'ancrage ne la dépasse. Le danger, en l'absence de filet, est l'effondrement du marché du jeton, qui nuit à ses détenteurs, et non un trou au bilan du protocole. Avec la file active, l'arbitrage de rachat plafonne le décrochage entièrement sous la zone d'emballement.

Reflexive de-peg outcomes under a frozen and a live redemption queue.WHEN THE FORCED SELLING MOVES THE PEG ITSELFREDEMPTIONS FROZENJune-2022 style, no backstopshock past the trigger0.19%peg runs to≈3% of parprotocol bad debt$0REDEMPTIONS LIVEthe 2023+ book, queue workingarbitrage caps the de-peg at1–3%runaway regionnever reachedprotocol bad debt$0The backstop bounds the peg collapse; the LT(1+b) invariant bounds the protocol loss. The liquidation threshold governs neither.
Fig. 5:Le point fixe d'ancrage endogène sur la grappe en direct. Le filet borne l'ancrage ; l'invariant borne la perte. La profondeur du pool est une hypothèse explicitée et balayée.

Ce que cela change pour un comité de paramètres

La recommandation de l'article se scinde selon l'axe qui décide quels paramètres s'appliquent réellement. Une position wstETH détenue sous la catégorie corrélée à ETH est régie par le seuil de la catégorie, donc modifier le seuil de la réserve ne l'atteint pas. Sur 1 723 comptes détenant du collatéral wstETH, 56 se situent à un seuil effectif que seule cette catégorie atteint ; les 1 667 autres sont valorisés au titre de la réserve.

  • Abaisser le seuil de la réserve de 0,81 vers 0,59 fait passer le montant à risque sous décrochage de 5% des comptes en mode réserve de 16,9 M$ à 144,1 M$, une multiplication par huit, sans supprimer aucune perte réalisée. Il n'y en a aucune à supprimer dans ce segment.
  • La catégorie e-mode est là où vit la queue de distribution, et les contrôles opérationnels y sont le plafond d'approvisionnement et un filet de retrait fonctionnel, dont aucun n'est fourni par un changement de seuil.
  • Les bornes de déviation et de heartbeat de l'oracle régissent les canaux de saut et de retard, par lesquels la perte entre effectivement.
  • Des plafonds d'approvisionnement dimensionnés sur la profondeur du marché secondaire régissent le canal de liquidation partielle, celui qui enregistre une perte à des sauts que la frontière en pool profond traite comme inoffensifs.

Dit simplement : le seuil de liquidation n'est pas le levier. Il fixe où le volume commence, et le volume n'est pas ce qui coûte de l'argent au protocole.

Pourquoi le zéro du moteur est fiable

Un résultat exactement nul invite à demander si le moteur est capable d'enregistrer une perte du tout. Il l'est, et l'article consacre une partie de sa longueur à le démontrer plutôt qu'à l'affirmer.

  • Le même moteur enregistre une perte réalisée importante lorsque la trajectoire est rompue : vendue dans un pool fini de 2 Md$, la grappe dispersée enregistre 203 M$ à partir d'environ 3% de décrochage. Notez quelle frontière est franchie. C'est le seuil en pool fini de 2,10%, non le D* en pool profond de 6,05%, parce qu'un pool fini avance le déclenchement. Ce 0$ est donc la valeur de la courbe sous son point de rupture, et non un plancher dont le code ne peut sortir.
  • Trois épisodes réels se reconstruisent au même endroit. Le plus exigeant est un livre stETH d'Aave v2 antérieur à l'événement, tiré d'un état d'archive avant le décrochage de juin 2022 et parcouru le long de la trajectoire réelle de l'ancrage : il enregistre 0$ face à la perte réalisée négligeable du protocole. Une reconstruction distincte, à partir des reçus de liquidation du même épisode, enregistre également 0$ sur la trajectoire, et là un instantané au point bas unique aurait déclenché une fausse alerte de 25,1 M$. L'article tient ces deux constructions séparées et elles s'accordent sur le zéro.
  • Le contrefactuel USDC de mars 2023 signale 0,3 M$ sur 26 positions face à 0$ réalisé, et ces 26 se réconcilient exactement avec la reconstruction de l'oracle figé.
  • Le noyau critique est en Rust, avec une référence Python et un jumeau Numba, numériquement équivalents à 1e-9 près ; l'écart absolu maximal observé est d'environ 2,3e-13 sur un test de 300 cas.
  • Les graines sont fixées à 20260609 et les fils BLAS plafonnés à un avant l'import de numpy. Les schémas de permutation, les tests de renforcement et leurs règles de verdict sont consignés dans un plan d'analyse verrouillé par empreinte. L'article est prudent sur ce que cela garantit : l'empreinte certifie l'intégrité du plan, non son antériorité dans le temps, puisque la date de verrouillage est auto-déclarée et que les fichiers entrent dans l'historique git quatre jours plus tard. Le test du livre antérieur à l'événement a été ajouté après le verrouillage et est étiqueté comme tel.

Le même moteur, sur une perte qui a bien eu lieu

En novembre 2022, un compte a emprunté 92 millions de CRV contre un collatéral en USDC et la position s'est retournée. Alors que le jeton était poussé à la hausse, la liquidation n'a pas pu solder la dette assez vite : les liquidateurs ont remboursé 89,6 M de CRV, le collatéral s'est épuisé, et 2,39 M de CRV de dette sont restés. L'article ne publie délibérément aucun chiffre de profondeur ou de slippage pour cet épisode, parce que l'ajustement d'impact prix pendant la pression a donné un R² négatif, et qu'un chiffre qu'une constante battrait vaut moins que pas de chiffre.

Ce résidu, au prix de 0,693$ en vigueur, est la perte : 1,65 M$ modélisé face à environ 1,60 M$ réalisé on-chain, une erreur de 3,4%. C'est l'image en miroir du résultat de décrochage et cela sort du même noyau. Quand le coût de solder dépasse le bonus de liquidation, la liquidation se bloque et le résidu devient la perte du protocole. Un seul moteur reproduit à la fois un vrai trou de 1,6 M$ et un vrai 0$.

100M50M092.0MCRV borrowed−89.6MliquidatedCRV debt repaidresidual debt2.39M CRV unrepayable× $0.693 = $1.65M bad debtMODELED BY THE ENGINE$1.65MREALIZED ON-CHAIN$1.60M3.4% error
Fig. 6:L'épisode Aave-CRV reconstruit : 92 M de CRV empruntés, 89,6 M récupérés, et le résidu irrécupérable de 2,39 M valorisé au cours en vigueur. Modélisé 1,65 M$ contre 1,60 M$ réalisé.

Ce que ce 0$ couvre et ne couvre pas

  • L'affirmation stricte porte sur le noyau de boucles pures de 1,357 Md$. Les 1,76% restants sont des positions à collatéral mixte dont les autres jambes portent leurs propres paramètres ; l'invariant fait de 0$ le résultat attendu là aussi, mais cela est divulgué plutôt qu'intégré.
  • L'instantané en direct porte le seuil de liquidation effectif de chaque compte, mais pas la catégorie e-mode sélectionnée, donc l'appartenance est inférée du LT effectif. La séparation est nette, avec un large vide entre les deux groupes, mais elle reste une approximation.
  • Une créance irrécouvrable nulle pour le protocole n'est pas un coût économique nul. Ces mêmes liquidations versent le bonus aux liquidateurs, imposent des pertes réelles aux emprunteurs liquidés, et peuvent déclencher une compensation par la DAO. L'affirmation porte sur le bilan du protocole.
  • Le balayage du seuil de réserve applique un seuil plus bas au livre figé d'aujourd'hui, donc il mesure le coût de transition ponctuel, non l'état stationnaire vers lequel un seuil durablement plus bas convergerait.

Reproduire

Le moteur, le noyau Rust, les scripts d'acquisition, le harnais de parité, les fixtures gelées et le préenregistrement sont publiés intégralement. Les données de marché ne sont pas redistribuées : l'état en direct vient d'un RPC d'archive public, les journaux d'événements de Bitquery, et les relevés de prix de CoinGecko Pro, les identifiants étant lus depuis l'environnement. Les chiffres principaux tournent sur un instantané figé et haché, de sorte que les affirmations sont vérifiables face aux entrées plutôt que rejouées depuis un clone sans clés. github.com/DaruFinance/defi-param-stress

Citer

Travaux liés

The de-peg engine’s credibility checks fit peaks-over-threshold GPD tails and a tail-dependence coefficient χ. That is the same machinery, implemented and demonstrated on its own, in Peaks-over-threshold and pairwise tail-coupling.