Liquidazioni on-chain: le meccaniche di Aave e Compound, e il business dei bot che ci gira intorno
Una liquidazione su Aave è un'offerta pubblica permanente: ripaghi il debito di qualcun altro e ricevi il suo collaterale con uno sconto del 5-15%. L'offerta è scritta in un contratto immutabile, non richiede alcun permesso, nessun KYC, nessuna relazione con il protocollo — basta essere il primo indirizzo a chiamare liquidationCall() nel blocco in cui una posizione supera la soglia. È la gara più pura di tutta la crypto: il premio è noto al centesimo, il trigger è (per lo più) prevedibile, e l'unica domanda è se la tua infrastruttura arriverà prima di tutte le altre.
Questo articolo analizza la macchina da cima a fondo: la matematica esatta che definisce quando una posizione diventa liquidabile, perché le meccaniche dell'oracolo Chainlink rendono le liquidazioni prevedibili piuttosto che reattive, di cosa è fatto davvero un bot di liquidazione competitivo, e perché l'economia della gara si è compressa al punto che la maggior parte del bonus finisce ora ai block builder — e, sempre più spesso, torna indietro ai protocolli stessi. Alla fine confrontiamo tutto questo con le liquidazioni sui perp-DEX (GMX, Hyperliquid), che sembrano superficialmente simili ma sono un gioco completamente diverso.
Le meccaniche: health factor, soglie, bonus
LTV vs soglia di liquidazione
Ogni asset collaterale su Aave v3 porta con sé due parametri di rischio distinti, e confonderli è l'errore più comune tra i borrower:
- LTV (loan-to-value) — il massimo che puoi prendere in prestito contro l'asset all'apertura della posizione. Per WETH su Aave v3 mainnet è circa l'80%.
- Soglia di liquidazione — il livello di collateralizzazione al quale la posizione diventa liquidabile. Per WETH, circa l'83%.
Il divario tra i due è un margine deliberato: non puoi aprire una posizione che sia istantaneamente liquidabile. Ma il margine è sottile — pochi punti percentuali di movimento avverso del prezzo separano "al massimo del prestito" da "in palio per chiunque."
L'health factor aggrega tutto in un unico numero:
dove è la quantità dell'asset collaterale , il suo prezzo da oracolo, la sua soglia di liquidazione, e il valore di ogni posizione di debito. Quando , chiunque può liquidare. Non c'è periodo di grazia, non c'è margin call, non c'è notifica. La condizione viene valutata in modo lazy — non succede nulla finché qualcuno non chiama la funzione.

Close factor e bonus di liquidazione
Altri due parametri definiscono cosa ottiene il liquidatore:
- Close factor — la frazione del debito che una singola liquidazione può ripagare. Il default di Aave v3 è il 50%. Da Aave v3.3, il close factor sale al 100% quando (il
CLOSE_FACTOR_HF_THRESHOLD), o quando il collaterale o il debito della posizione sono sotto una soglia di dust (~2.000 $) — le posizioni piccole non valgono due transazioni, e il dust residuo crea problemi di contabilità del bad debt. - Bonus di liquidazione (chiamato anche penalità di liquidazione, a seconda del punto di vista) — lo sconto al quale il liquidatore acquista il collaterale. Su Aave è uno spread fisso impostato per ogni asset dalla governance: circa il 5% per WETH e le principali stablecoin, fino al 10-15% per collaterali volatili di lungo tail.
Compound v2 funziona allo stesso modo con costanti diverse: liquidateBorrow() con un close factor del 50% e un incentivo di liquidazione dell'8% (il cToken di collaterale sequestrato vale 1,08 volte il debito ripagato). Compound v3 (Comet) ha ridisegnato il flusso in due passaggi: absorb() porta la posizione in sofferenza sul bilancio del protocollo stesso (il debito viene socializzato nelle riserve, il collaterale diventa proprietà del protocollo), e buyCollateral() permette a chiunque di acquistare quel collaterale dal protocollo con uno sconto configurato dalla governance, pagato nell'asset base. In pratica un liquidatore chiama entrambe le funzioni in un'unica transazione — absorb di per sé non paga nulla, il profitto sta interamente nel buyCollateral scontato.
Una posizione concreta, liquidata passo per passo
Prendiamo parametri rappresentativi di Aave v3 per WETH: LTV 80%, soglia di liquidazione 83%, bonus di liquidazione 5%.
Setup. Depositi 10 WETH a 3.000 di collaterale) e prendi in prestito 20.000 USDC.
Prezzo di liquidazione. quando il valore del collaterale scende a 20{,}000 / 0.83 = 24{,}096 \$$, cioè ETH a **2.410 ** — un drawdown del 19,7%. Sembra sicuro. Non lo è, perché ETH fa drawdown del 20% a colazione.
Il calo. ETH stampa 2.350 :
, quindi si applica il close factor del 50%. Un liquidatore ripaga 10.000 USDC del tuo debito e sequestra collaterale del valore di $10{,}000 \times 1.05 = 10{,}500 $$ al prezzo dell'oracolo:
Il P&L del liquidatore. Ha speso 10.000 di ETH: 500 $ di profitto lordo per una singola chiamata di funzione, prima del gas, dei costi di swap per uscire dall'ETH e — soprattutto — prima di quanto ha dovuto offrire per vincere la gara (ne parliamo più avanti).
Il tuo P&L. Debito sceso a 10.000 ). Nuovo health factor:
Nota due fatti scomodi. Primo, hai pagato 500 $ per il privilegio di un deleveraging forzato — il bonus esce interamente dal tuo equity. Secondo, il nuovo HF di 1,079 è appena sopra la soglia critica: un altro calo del 7% di ETH ritrigger la liquidazione sulla metà rimanente. La liquidazione a spread fisso ripristina la solvibilità, non la sicurezza. Questo schema di "liquidazione parziale, ancora fragile, liquidato di nuovo" è la microstruttura dietro le dinamiche a cascata, che trattiamo nell'articolo gemello sulle cascate di liquidazione come segnale di trading.
Il trigger: le liquidazioni sono prevedibili, non reattive
Ecco la parte che separa chi capisce questo business da chi non lo capisce: su Aave e Compound, le posizioni non diventano liquidabili quando il prezzo di mercato si muove. Diventano liquidabili quando l'oracolo si aggiorna.
Entrambi i protocolli leggono i prezzi dai feed dati Chainlink. Un feed Chainlink su Ethereum mainnet pubblica un nuovo prezzo on-chain quando si verifica una di due condizioni:
- Soglia di deviazione — il prezzo aggregato off-chain si muove più di una certa percentuale rispetto all'ultimo valore on-chain: 0,5% per ETH/USD su mainnet, 1-2% per la maggior parte dei feed più piccoli.
- Heartbeat — un intervallo massimo (3.600 secondi per ETH/USD) dopo il quale un aggiornamento viene pubblicato a prescindere dalla deviazione.
Questo ha una conseguenza profonda. Tra un aggiornamento e l'altro, il prezzo on-chain è stale per costruzione. Se ETH su Binance scende dello 0,6% mentre il feed on-chain mostra ancora il vecchio prezzo, ogni attore sofisticato sa che sta per arrivare una transazione di aggiornamento dell'oracolo, sa (approssimativamente) quale sarà il nuovo prezzo, e può calcolare — prima che l'aggiornamento avvenga — esattamente quali posizioni supereranno nel momento in cui accadrà.

La strategia dominante quindi non è "osservare gli health factor e reagire" ma fare backrun dell'aggiornamento dell'oracolo: costruire un bundle in cui la tua liquidationCall() viene eseguita immediatamente dopo la transazione di transmit di Chainlink, nello stesso blocco. L'aggiornamento dell'oracolo è il colpo di pistola dello starter, e tutti possono vedere lo starter alzare la pistola. Le meccaniche del bundle — invio privato ai block builder, garanzie di ordinamento atomico — sono lo stesso macchinario che abbiamo trattato nell'articolo su sandwich attack e frontrunning nel mempool; le liquidazioni ne sono semplicemente l'uso più legittimo.
Due affinamenti contano nella pratica:
- Non hai nemmeno bisogno di vedere il transmit nel mempool. Dato che l'aggregazione off-chain è osservabile (puoi eseguire lo stesso calcolo del prezzo dai feed dei CEX), puoi prevedere che un aggiornamento deve scattare una volta che la deviazione supera la soglia, e pre-costruire bundle sia per il percorso di prezzo al rialzo che per quello al ribasso.
- Gli aggiornamenti heartbeat sono eventi di liquidità programmati. Se un feed non ha deviato dello 0,5% in un'ora, un aggiornamento arriva comunque — e se il prezzo si è mosso dello 0,4% contro un muro di posizioni raggruppate vicino a , quell'heartbeat "innocuo" è il trigger. Gli operatori competitivi tracciano il tempo trascorso dall'ultimo aggiornamento per feed come segnale di prima classe.
Questa prevedibilità è anche il motivo per cui i protocolli hanno alla fine deciso di recuperare valore. Nel marzo 2025, Aave ha integrato Chainlink SVR (Smart Value Recapture): gli aggiornamenti dell'oracolo per i feed partecipanti vengono instradati tramite Flashbots MEV-Share, il diritto di fare backrun viene messo all'asta, e l'offerta vincente viene divisa tra la Aave DAO (65%) e Chainlink (35%) invece di finire interamente ai searcher e ai builder. Nel giro di pochi mesi il sistema aveva processato oltre 32 milioni di dollari in liquidazioni e recuperato oltre 1,1 milioni di dollari, catturando oltre l'80% della MEV di liquidazione idonea. Leggilo come un prezzo di mercato: la gara aperta era diventata così efficiente che il protocollo ha potuto mettere all'asta il traguardo.
Costruire il bot: i quattro sottosistemi
Un bot di liquidazione competitivo non è uno script; è un'infrastruttura degna di una piccola società di trading. Quattro sottosistemi, ognuno singolarmente semplice, tutti critici in termini di latenza nel loro insieme.

1. Indicizzazione delle posizioni
Ti serve l'insieme completo dei borrower e dei loro saldi, mantenuto in tempo reale. Il bootstrap è un backfill degli eventi — ogni Supply, Borrow, Repay, Withdraw, LiquidationCall dal deployment del protocollo — ripiegato nei saldi correnti per utente, poi mantenuto live tramite una sottoscrizione websocket ai nuovi log. getUserAccountData(address) di Aave restituisce direttamente l'health factor, ma chiamarla per ogni utente a ogni blocco per oltre 100k borrower è impossibile; gli operatori seri replicano localmente la contabilità del protocollo (inclusa la matematica dell'indice del tasso di interesse, dato che il debito cresce ogni secondo) e riservano le chiamate RPC per la verifica.
2. Monitoraggio dell'health factor con simulazione dell'oracolo
Il loop centrale non è "calcola HF ai prezzi correnti dell'oracolo." È "calcola HF al prezzo che l'oracolo sta per pubblicare":
def liquidatable_at(positions, feed, candidate_price):
"""Positions that cross HF < 1 if `feed` updates to candidate_price."""
out = []
for pos in positions.borrowers_exposed_to(feed):
hf = pos.health_factor(price_override={feed: candidate_price})
if hf < 1.0:
close_factor = 1.0 if hf < 0.95 else 0.5
repay = pos.debt_value * close_factor
seized = repay * (1 + pos.liq_bonus)
gross = seized - repay # the prize, pre-costs
out.append((pos, repay, gross))
return sorted(out, key=lambda x: -x[2])
deviation = abs(offchain_px - onchain_px) / onchain_px
if deviation > FEED_DEVIATION_THRESHOLD * 0.8: # update imminent
targets = liquidatable_at(positions, feed, offchain_px)
for pos, repay, gross in targets:
prepare_bundle(pos, repay, max_bid=gross - costs(pos))
Ordinare le posizioni per vicinanza a (una coda a priorità indicizzata sul prezzo che triggererebbe ciascuna posizione) mantiene piccolo l'insieme "caldo." Il fattore 0.8 è tutto il gioco: vuoi bundle costruiti e inviati prima che l'aggiornamento sia certo, non dopo.
3. Esecuzione finanziata da flash loan
Non ti serve capitale per liquidare — ti serve per circa 200 millisecondi di tempo di blocco. Il contratto di esecuzione canonico fa, in modo atomico:
- Prende in prestito flash l'asset di debito (Balancer allo 0 bps, o Aave stesso a ~5 bps — lo stesso primitivo che abbiamo costruito in arbitraggio atomico con flash loan).
- Chiama
liquidationCall(collateral, debtAsset, user, repayAmount, false)— ilfalsefa sì che riceva il collaterale sottostante invece degli aToken. - Fa swap del collaterale sequestrato tornando all'asset di debito sul venue che quota meglio (Uniswap v3 / v4, route 1inch, o un fill privato).
- Ripaga il flash loan; il resto è profitto, verificato con un
require(profit >= minProfit)così che una simulazione stale faccia revertire invece di eseguire in perdita.
Il leg dello swap è dove i bot sciatti muoiono: sequestrare 10.500 $ di un token di lungo tail significa mangiarsi la sua liquidità DEX, e il price impact in uscita può superare il bonus di liquidazione. Gli operatori competitivi simulano l'intero round trip — incluso lo swap di uscita — e saltano le liquidazioni in cui il netto è negativo, oppure tengono il collaterale e si coprono su un perp invece di scaricarlo sul mercato.
4. Invio del bundle
La transazione finale non passa mai vicino al mempool pubblico. Viene inviata come bundle ai block builder (o nell'asta SVR/OEV dove applicabile), dichiarando: "posiziona la mia liquidazione immediatamente dopo questo transmit dell'oracolo; ecco la mia tip." La tip è la tua offerta in un'asta all-pay-nothing-if-you-lose contro ogni altro bot che ha eseguito la stessa simulazione. Il che ci porta all'economia scomoda.
La competizione: dove finisce davvero il bonus
Il riferimento accademico è Qin, Zhou, Gamito, Jovanovic e Gervais, "An Empirical Study of DeFi Liquidations: Incentives, Risks, and Instabilities" (2021), che ha misurato il business su Aave, Compound, MakerDAO e dYdX da aprile 2019 ad aprile 2021: 28.138 liquidazioni per un totale di 807 milioni di dollari, con 63,6 milioni di dollari di profitto aggregato dei liquidatori. Il paper ha anche documentato l'inefficienza strutturale della liquidazione a spread fisso — lo sconto è uno strumento contundente che penalizza sistematicamente i borrower oltre quanto farebbe un'asta — e ha mostrato liquidatori che lasciavano sul tavolo somme misurabili con strategie ingenue.
I profitti di quell'era non si ripeteranno, per tre ragioni che si sommano:
L'asta del gas è diventata un'asta dei builder. Nel 2019-2020, i liquidatori competevano in aste a priorità sul gas nel mempool aperto; il vincitore pagava troppo di gas, i perdenti revertivano, e una frazione significativa del bonus restava al liquidatore. Dopo MEV-Boost, la competizione avviene in aste sigillate tra i builder. Quando N bot simulano la stessa opportunità deterministica arrivando alla stessa cifra di profitto, le offerte convergono verso il premio intero: il bundle vincente tipicamente dà in tip oltre il 90% del profitto lordo al builder/validatore. Il vantaggio del liquidatore si riduce a chi ha un pricing di uscita marginalmente migliore, costi marginalmente più bassi, o opportunità che altri non hanno visto.
I backrun dell'oracolo dominano, e vengono recintati. Dato che quasi tutte le liquidazioni sui money market sono triggerate da aggiornamenti dell'oracolo, lo spazio delle strategie redditizie è collassato su un unico punto: vincere lo slot subito dopo il transmit. I meccanismi in stile SVR formalizzano questo — il protocollo mette all'asta quello slot e ne trattiene la maggior parte dei proventi. La quota del searcher si riduce da "il bonus meno il gas" a "il margine del vincitore dell'asta," che la concorrenza sulle offerte spinge verso zero.
Quello che resta è il long tail. Le nicchie realistiche per un nuovo entrante nel 2026: chain e L2 dove i mercati dei builder sono ancora immaturi; fork di lending long-tail con parametri di bonus sbagliati e pochi bot concorrenti; posizioni con collaterale esotico dove la simulazione dello swap di uscita è genuinamente difficile (vantaggio tramite esecuzione migliore, non latenza migliore); ed eventi di stress, quando il gas schizza e i fallimenti RPC mettono fuori gioco gli operatori marginali — il Black Thursday di MakerDAO (marzo 2020), quando aste a offerta zero permisero ai liquidatori di reclamare 8,3 milioni di dollari di collaterale essenzialmente gratis perché l'infrastruttura di nessun altro funzionava, resta l'esempio canonico del fatto che la gara paga meglio proprio quando è più difficile da gestire.
Dimensionare l'aspettativa onesta: questo è ormai un business con veri costi fissi (nodi, relazioni con i builder, monitoraggio su una dozzina di deployment) che compete per un montepremi pesantemente scontato. È un ottimo modo per imparare più cose sull'EVM, sugli oracoli e sull'idraulica della MEV di quante ve ne possa insegnare qualsiasi corso. È un modo difficile per guadagnarsi da vivere.
Liquidazioni sui perp-DEX: stessa parola, gioco diverso
Anche i DEX di perpetual "liquidano," e i numeri di testata sono più grandi — ma il meccanismo, e quindi l'opportunità, è strutturalmente diverso.
GMX (v2): le posizioni fanno trading contro un pool di liquidità a prezzi da oracolo (Chainlink Data Streams a bassa latenza). La liquidazione scatta quando il collaterale meno le perdite e le commissioni scende sotto i requisiti di mantenimento, ed è eseguita da keeper — infrastruttura designata che opera su prezzi firmati dall'oracolo, non una gara aperta. Non esiste una funzione pubblica che paga un bonus del 5% a chi chiama per primo; il collaterale residuo fluisce verso il pool secondo le regole del protocollo. Dal punto di vista di un searcher non c'è nulla da vincere.
Hyperliquid: le liquidazioni girano dentro il matching engine della L1 stessa. Quando l'equity dell'account scende sotto il margine di mantenimento (valutato a un mark price che fonde i feed dei CEX e l'order book, proprio per resistere ai giochi sull'oracolo descritti sopra), il motore invia ordini di mercato di liquidazione nell'order book — posizioni grandi frazionate in blocchi per limitare l'impatto. Se l'equity continua a scendere sotto i due terzi del margine di mantenimento, la posizione viene rilevata al mark price da un vault di liquidazione di backstop che è una strategia dentro HLP, il vault di market-making a proprietà comunitaria del protocollo, con l'auto-deleveraging come strato finale. Il P&L di liquidazione va ai depositanti di HLP — il "profitto del liquidatore" viene socializzato in un vault a cui chiunque può partecipare, non conteso a ogni singolo evento.
La conseguenza per un trader: sui money market, il gioco è essere il liquidatore — una gara infrastrutturale per uno spread fisso. Sui perp DEX, il ruolo di liquidatore è chiuso, quindi il gioco si sposta su fare trading intorno alle liquidazioni: i prezzi di liquidazione sono calcolabili dalle posizioni aperte, il flusso forzato colpisce un order book visibile, e i livelli di liquidazione raggruppati diventano sia un magnete sia una fonte di carburante per i movimenti di prezzo. È la stessa logica che rende tradabili le cascate di liquidazione sui CEX — la dinamica che abbiamo toccato in i funding rate uccidono la tua leva (il costo della leva è ciò che spinge le posizioni verso il precipizio) e in le meccaniche di pump-and-dump degli shitcoin (spinte ingegnerizzate dentro i cluster di liquidazione). La trattazione completa delle cascate come segnale — rilevarle mentre si formano, misurarne il carburante, fare trading sull'overshoot — è l'argomento del prossimo articolo di questa serie.
Cosa portarsi a casa
La liquidazione sui money market è il raro angolo della crypto dove tutto è leggibile: la condizione di trigger è una formula, il premio è una costante fissata dalla governance, il colpo di pistola è una transazione dell'oracolo che puoi vedere arrivare. Questa leggibilità ha costruito un business genuinamente aperto nel 2019-2021, e poi — proprio perché tutto era leggibile — la concorrenza ha spinto il vantaggio verso la qualità dell'infrastruttura e ha rimesso all'asta il resto, restituendolo ai protocolli. Le meccaniche restano conoscenza essenziale: se prendi in prestito on-chain, questa matematica è il tuo modello di rischio; se fai trading intorno al flusso forzato, la cadenza dell'oracolo e i close factor ti dicono quando e quanto; e se comunque costruisci il bot, almeno costruiscilo sapendo dove finiscono davvero i soldi.
Autori
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.