SSRN 7157638 · estudo do livro ao vivo da Aave v3

Publicado · SSRN

Liquidation Without Loss

A Live-Book Decomposition of Aave v3

By

Lido como um número de perda, o valor em risco de um livro em loop superestima sem limite a exposição de um protocolo de crédito. Este artigo separa as três quantidades que um teste de estresse colapsa em uma, deriva a profundidade em que volume poderia virar perda e dimensiona os canais que de fato fazem essa conversão. Tudo abaixo roda sobre um único bloco ao vivo da Ethereum: 17.419 tomadores, US$ 6,5 bi de dívida.

Parceiros de dados

A Bitquery forneceu os logs de eventos e as enumerações de tomadores, incluindo o livro pré-evento da Aave v2 usado no teste fora da amostra. A CoinGecko Pro forneceu as marcações diárias de preço por trás da cesta de covariância e das reconstruções de eventos. Ambas concederam acesso de API como patrocinadoras deste trabalho.

O que o artigo estabelece

O RESULTADO

US$ 1,38 bi elegível, US$ 0 perdido

Uma desancoragem de 5% na fatia de liquid staking de 1.437 posições sinaliza US$ 1,38 bi como elegível para liquidação. Cerca de metade disso transaciona e, no núcleo puro de loops de US$ 1,357 bi que a engine percorre, nada disso é capital que o protocolo perde.

O MECANISMO

LT(1+b) < 1

Quando o limite de liquidação de uma categoria multiplicado pelo seu bônus fica abaixo de um, um loop que cruza HF = 1 é removido enquanto seu colateral ainda cobre a dívida acrescida do bônus. A Aave satisfaz isso nas oito categorias de e-mode ativas.

O CONTROLE

Rompa a trajetória, não a profundidade

A perda exige um salto discreto de preço, um oráculo defasado ou um pool raso demais para absorver a apreensão. Profundidade sozinha não a produz. Portanto as alavancas são os limites do oráculo e os tetos de oferta, não o limite de liquidação.

Três quantidades, não uma

Um teste de estresse imprime um número e uma mesa de risco o lê como perda. Em um livro em loop ele não é nem o volume que transaciona nem o capital que o protocolo perde, e as três quantidades se separam com nitidez quando o livro é percorrido por uma trajetória real de preços em vez de marcado em um único fundo.

Dívida elegível é a dívida em posições cujo fator de saúde cruza um. Sob um fator de fechamento parcial a posição é liquidada em partes: uma chamada paga uma fração da dívida corrente, a apreensão a recoloca acima do limite e ela pode cruzar de novo mais adiante. Assim a dívida elegível chega a cerca de duas vezes o pagamento executado, e no cluster ao vivo nenhuma posição é encerrada por completo.

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:O cluster de loops ao vivo sob uma desancoragem de 5%: 236 posições, US$ 2,19 bi. Este é o núcleo puro de loops que a engine de trajetória contínua percorre, carregando US$ 1.356,9 mi dos US$ 1.381,5 mi que a fatia mais ampla de 1.437 posições sinaliza. Dívida elegível não é volume executado, e volume executado não é perda. De headline_liveslice.json.

Por que um loop está protegido contra o choque que todos testam

Um loop deposita um ativo, toma emprestado um ativo correlacionado e redeposita. A engine de estresse escala o fator de saúde real on-chain de cada posição por um movimento ponderado entre colateral e dívida, em que cada u é o valor em dólares daquela perna e o HF₀ on-chain já embute os limites de e-mode do protocolo. Escrita como razão, ela assume que as pernas de colateral compartilham um único limite de liquidação, o que vale para o núcleo puro de loops; a forma explícita por ativo carrega o limite de cada perna dentro do somatório de colateral:

O mecanismo fica visível na razão. Quando a classe do colateral é igual à classe da dívida, os fatores (1 + movimento) se cancelam e uma queda de mercado quase não altera o fator de saúde. O loop sobrevive. Uma posição direcional, cuja perna de dívida em stablecoin é mantida enquanto o colateral cai, absorve o movimento integralmente.

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
O fator de saúde sob choque. Nada aqui re-deriva um loan-to-value; a engine se ancora no fator de saúde real on-chain para que os próprios limites de e-mode do protocolo sejam preservados.

É por isso que o número que um painel uniforme reporta para um livro em loop é uma convenção de netting e não uma propriedade do livro. Contra uma mesa que faz o netting corretamente, o modelo correlacionado e o contraste de mesma classe concordam dentro de 8% em toda severidade, 0,92× a −5%. As razões maiores de 6,53× e 9,13× medem o tamanho de uma omissão de netting. E o cancelamento não é artefato de como os ativos são agrupados: embaralhar o pareamento colateral-dívida derruba a razão de 9,13× para cerca de 1,3×, p = 0,0002 sob os dois esquemas.

A invariante que torna a liquidação sem perda

Um loop é liquidado sob os parâmetros do modo em que é mantido, e é aqui que uma leitura pode errar: o cluster ao vivo está no e-mode correlacionado a ETH, cujo bônus de categoria é 1%, não o bônus de 6% da reserva wstETH. Lido do contrato Pool, o par é LT 0,95 com b = 0,01.

Um liquidante que apreende colateral no valor do pagamento acrescido do bônus é limitado ao colateral que a posição ainda detém. Assim um déficit só pode abrir quando o colateral deixa de cobrir essa apreensão acrescida, o que dá a condição diretamente:

Com LT 0,95, alcançar o regime de perda no cruzamento exigiria um bônus acima de 5,26%, cinco vezes o que a Aave define. Cada uma das oito categorias de e-mode ativas fica entre 0,876 e 0,960, e o par da reserva wstETH é 0,859. Isso não é um fio de navalha, e é por isso que o US$ 0 é estrutural em vez de um achado empírico de robustez.

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:Todo par de parâmetros ativo da Aave fica abaixo de um, com margem. Quem confundisse o bônus de 6% da reserva com o bônus de 1% da categoria calcularia 1,007 e concluiria o oposto.

Onde o volume poderia virar perda

A distância entre volume e perda só se torna acionável quando se pode dizer onde ela termina. Um loop que deposita colateral C ao limite LT contra dívida D tem fator de saúde on-chain HF₀ = C·LT/D, e uma desancoragem de profundidade f marca o colateral para baixo contra a perna de dívida mantida. Duas profundidades importam, e o ponto de ruptura é a maior delas:

O primeiro termo é onde o fator de saúde chega a um e a liquidação se torna elegível. O segundo é onde a apreensão acrescida do bônus deixa de ser coberta e a dívida irrecuperável do protocolo começa. A perda não pode começar antes de o loop ser sequer liquidável, então D* é o máximo. Em termos de alavancagem, ambos encolhem conforme o loop se alavanca.

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
O ponto de ruptura em forma fechada. A figura abaixo plota esta função diretamente em vez de uma cópia traçada dela, de modo que a curva na tela é a equação do texto.

Para a âncora de e-mode ao vivo, a cerca de 12× de alavancagem, o loop se torna elegível para liquidação em 3,5% mas só começa a perder em 7,4%: uma faixa de 3,9 pontos em que a desancoragem produz puro fluxo. A mediana ao longo da fatia ao vivo é 6,9%, e 8,8% ponderada por dívida. A forma fechada reproduz o início da perda da engine de cascata dentro de um passo de grade, no máximo 0,02%, em todos os pontos verificados.

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* contra a alavancagem do loop para os dois pares de parâmetros ativos, com os inícios da engine de cascata sobrepostos. Mais alavancagem encurta a faixa; a âncora de e-mode ao vivo ainda mantém 3,9 pontos dela.

O que de fato converte volume em perda

Como todo loop ao vivo está no regime com folga de solvência, uma desancoragem contínua mais profunda não converte volume em perda. O loop é removido no seu próprio cruzamento, ainda solvente, em qualquer profundidade. Percorrido por um deslizamento contínuo, o loop âncora registra US$ 0 de 2% a 20%. O que converte é uma ruptura da trajetória, e cada canal pode ser dimensionado na mesma engine.

O canal que morde primeiro não é o dramático. Um salto discreto largo o suficiente para pular a fronteira não registra nada até 8%. A liquidação parcial em um pool finito registra US$ 3,01 mi num salto de 5%, onde uma liquidação integral em um pool profundo registra zero, porque a posição fica submersa ao longo de várias rodadas enquanto cada venda forçada deprime o preço para a seguinte. Essa cifra é um limite superior do canal: a Aave promove o fator de fechamento a 100% abaixo de um limiar de fator de saúde, e um único fechamento integral evita a depressão em múltiplas rodadas. A defasagem de oráculo medida em junho de 2022 multiplica um salto de 8% de US$ 0,58 mi para US$ 5,13 mi na cauda de defasagem profunda.

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)
O passo interno do kernel de cascata. Dois limites fazem todo o trabalho: uma chamada é limitada ao fator de fechamento da dívida corrente, e uma apreensão é limitada ao colateral que a posição ainda detém. A dívida residual é o que se registra como perda.
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:Dívida irrecuperável por loop na escala de US$ 100 mi, pelo canal que rompe a trajetória contínua. Os dois pares de parâmetros mantêm US$ 0 num deslizamento não rompido, então tudo aqui vem da ruptura.

A profundidade do mercado secundário define a magnitude e antecipa o início: para um cluster disperso o início cai de 6,05% contra um pool infinitamente profundo para 2,10% quando o pool é finito, e a perda realizada em um salto fixo de 15% sobe de US$ 30,2 mi para US$ 695,7 mi contra um pool de US$ 1 bi. Os loops não perdem porque são liquidados. Eles perdem se o mercado em que são liquidados for raso demais para absorver a apreensão.

Quando a venda forçada move a própria paridade

A objeção mais afiada a ler US$ 1,38 bi como volume é que ela assume que a venda se resolve sem mover a paridade. Para um token de liquid staking a paridade é um preço de mercado secundário, então o colateral despejado deprime exatamente a razão que o marca. Fechando esse laço endogenamente no cluster ao vivo, com a fila de resgate congelada, um choque acima do gatilho de 0,19% do loop mais alavancado leva a paridade a cerca de 3% do par, uma desancoragem de aproximadamente 97%.

Mesmo ali o protocolo registra US$ 0, porque cada loop é removido no seu próprio cruzamento solvente antes de a paridade passar por ele. O perigo sem um backstop é o colapso do mercado do token, que prejudica seus detentores, e não um buraco no balanço do protocolo. Com a fila ativa, a arbitragem de resgate limita a desancoragem inteiramente abaixo da região de descontrole.

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:O ponto fixo de paridade endógena no cluster ao vivo. O backstop limita a paridade; a invariante limita a perda. A profundidade do pool é uma suposição rotulada, varrida.

O que isso muda para um comitê de parâmetros

A recomendação do artigo se divide pelo eixo que decide quais parâmetros sequer se aplicam. Uma posição em wstETH mantida sob a categoria correlacionada a ETH é governada pelo limite da categoria, então uma mudança no limite da reserva não a alcança. Das 1.723 contas com colateral em wstETH, 56 estão em um limite efetivo que só aquela categoria alcança; as 1.667 restantes são precificadas pela reserva.

  • Cortar o limite da reserva de 0,81 em direção a 0,59 eleva o valor em risco sob desancoragem de 5% das contas em modo reserva de US$ 16,9 mi para US$ 144,1 mi, uma alta de oito vezes, sem remover qualquer perda realizada. Não há nenhuma nesse segmento para remover.
  • A categoria de e-mode é onde a cauda vive, e ali os controles operacionais são o teto de oferta e um backstop de saque ativo, nenhum dos quais uma mudança de limite oferece.
  • Os limites de desvio e de heartbeat do oráculo governam os canais de salto e defasagem, que é por onde a perda de fato entra.
  • Tetos de oferta dimensionados pela profundidade do mercado secundário governam o canal de liquidação parcial, o que registra perda em saltos que a fronteira de pool profundo trata como inofensivos.

Dito de forma direta: o limite de liquidação não é a alavanca. Ele define onde o volume começa, e volume não é o que custa dinheiro ao protocolo.

Por que o zero da engine é confiável

Um resultado de exatamente zero convida à pergunta de se a engine é capaz de registrar qualquer perda. Ela é, e o artigo dedica parte de sua extensão a demonstrar isso em vez de afirmá-lo.

  • A mesma engine registra perda realizada grande quando a trajetória é rompida: vendido em um pool finito de US$ 2 bi, o cluster disperso registra US$ 203 mi a partir de cerca de 3% de desancoragem. Note qual fronteira foi ultrapassada. Ela supera o início de pool finito de 2,10%, não o D* de pool profundo de 6,05%, porque um pool finito antecipa o início. Portanto o US$ 0 é o valor da curva abaixo do seu ponto de ruptura, não um piso do qual o código não consegue sair.
  • Três episódios reais reconstroem para o mesmo lugar. O mais exigente é um livro pré-evento de stETH na Aave v2, obtido de estado arquival antes da desancoragem de junho de 2022 e percorrido pela trajetória real da paridade: ele registra US$ 0 contra a perda realizada desprezível do protocolo. Uma reconstrução separada por recibos do mesmo episódio também registra US$ 0 na trajetória, e ali um retrato de fundo único teria levantado um falso alarme de US$ 25,1 mi. As duas construções são mantidas separadas no artigo e concordam no zero.
  • O contrafactual do USDC de março de 2023 sinaliza US$ 0,3 mi em 26 posições contra US$ 0 realizado, e essas 26 reconciliam exatamente com a reconstrução do oráculo travado.
  • O kernel quente é em Rust com uma referência em Python e um gêmeo em Numba, numericamente equivalentes dentro de 1e-9; a diferença absoluta máxima observada é cerca de 2,3e-13 em um teste de 300 casos.
  • As sementes são fixadas em 20260609 e as threads de BLAS são fixadas em uma antes de o numpy ser importado. Os esquemas de permutação, os testes de fortalecimento e suas regras de veredito estão escritos em um plano de análise com hash travado. O artigo é cuidadoso quanto ao que isso garante: o hash certifica a integridade do plano, não a sua prioridade no tempo, já que a data de travamento é autodeclarada e os arquivos entram no histórico do git quatro dias depois. O teste do livro pré-evento foi adicionado após o travamento e está rotulado como tal.

A mesma engine, sobre uma perda que aconteceu

Em novembro de 2022 uma conta tomou emprestado 92 milhões de CRV contra colateral em USDC e a posição virou. Enquanto o token era pressionado para cima, a liquidação não conseguiu quitar a dívida rápido o suficiente: os liquidantes pagaram 89,6 mi de CRV, o colateral acabou e 2,39 mi de CRV de dívida ficaram de pé. O artigo deliberadamente não publica nenhuma cifra de profundidade ou slippage para este episódio, porque o ajuste de impacto de preço durante a pressão teve R² negativo, e um número que uma constante superaria é pior do que nenhum número.

Esse residual, ao preço vigente de US$ 0,693, é a perda: US$ 1,65 mi modelado contra cerca de US$ 1,60 mi realizado on-chain, um erro de 3,4%. Esta é a imagem espelhada do resultado de desancoragem e sai do mesmo kernel. Quando o custo de liquidar supera o bônus de liquidação, a liquidação trava e o residual se torna a perda do protocolo. Uma engine reproduz tanto um buraco real de US$ 1,6 mi quanto um US$ 0 real.

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:O episódio Aave-CRV reconstruído: 92 mi de CRV tomados, 89,6 mi recuperados, e o residual impagável de 2,39 mi precificado à marcação vigente. Modelado US$ 1,65 mi contra US$ 1,60 mi realizado.

O que o US$ 0 cobre e o que não cobre

  • A afirmação estrita vale para o núcleo puro de loops de US$ 1,357 bi. O 1,76% restante são posições de colateral misto cujas outras pernas carregam seus próprios parâmetros; a invariante torna US$ 0 o resultado esperado ali também, mas isso é divulgado em vez de incorporado.
  • O retrato ao vivo carrega o limite de liquidação efetivo de cada conta, mas não a categoria de e-mode selecionada, então a pertinência é inferida do LT efetivo. A separação é limpa, com um amplo vazio entre os dois grupos, mas é um proxy.
  • Dívida irrecuperável do protocolo igual a zero não é custo econômico igual a zero. As mesmas liquidações pagam o bônus aos liquidantes, impõem perdas reais aos tomadores liquidados e podem acionar compensação da DAO. A afirmação é sobre o balanço do protocolo.
  • A varredura do limite da reserva aplica um limite mais baixo ao livro congelado de hoje, então mede o custo de transição de uma só vez, não o estado estacionário em que um limite permanentemente mais baixo se acomodaria.

Reproduzindo

A engine, o kernel em Rust, os scripts de aquisição, o harness de paridade, as fixtures congeladas e o pré-registro são publicados por completo. Os dados de mercado não são redistribuídos: o estado ao vivo vem de um RPC arquival público, os logs de eventos da Bitquery e as marcações de preço da CoinGecko Pro, com credenciais lidas do ambiente. Os números de destaque rodam sobre um retrato fixo e com hash, então as afirmações são verificáveis contra os insumos em vez de recoletadas de um clone sem chaves. github.com/DaruFinance/defi-param-stress

Citar

Trabalho relacionado

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.