レッスン0 — ADL は safety-net cascade の Layer 3
問い
清算スキャナが「保険基金でも吸収しきれない赤字」を残したとき、システムは最後に何をするのか? なぜそれを オーダーブック経由ではなく、帳簿の直接書き換えで やるのか?
注: OpenHL コースのコードブロックは原則として手元で実行可能な形で示す。ただし
<file>などのプレースホルダや答え合わせ用コマンドは、各レッスンの指示に従って置換してから実行すること。
原理(最小モデル)
ADL(auto-deleveraging)は safety-net cascade の 最後の層(Layer 3) だ。3 つだけ掴めばいい。
- トリガーは 1 つ。 スキャナが
ScanReport { unfilled_deficit > 0 }を返したとき、保険基金は吸収しきれなかった。bridge がexecute_adl(残りのアカウント, mark, unfilled_deficit)を呼ぶ。 - ランキングは Hyperliquid 慣例。 score =
pnl_pct × leverage。最も relative gain が高く、最もレバレッジを効かせて勝った winner が、最初に haircut される。 - 保存則が全体を bound する。
deficit_absorbed + deficit_remaining == input_deficit。吸収できた分と残った分の和は、必ず入力の赤字に等しい。
具体例
scanner → unfilled_deficit = 250 → ADL が profitable winner をランク順に haircut → 100 吸収できたら AdlReport { deficit_absorbed: 100, deficit_remaining: 150 }。deficit_remaining > 0 は「chain が解決不能な状態に達した」シグナルで、bridge が halt / protocol loss として処理する。
失敗例(誤解)
「利益ポジションに market order を出して閉じればいい」は誤り。matching engine 経由だと、各 order が bid/ask スタックを突き破って mark をさらに crash させ、より多くのポジションが水面下に落ちる feedback loop が暴走する。ADL が帳簿層で直接クローズするのは、この feedback-loop crash を断つためだ。
ここまでで「ADL が cascade のどこに座り、なぜ orderbook を避けるか」は着地した。ここから先は、その cascade の 全体構造 と 5 レッスンのロードマップに入る。L1 以降は実際に Rust を書く。
🛑 予測。 続きを読む前に、この 4 人をランク付けせよ(highest = 最初に haircut)。全員 long 1 BTC、全員 profitable、Hyperliquid の
pnl_pct × leverage慣例。
- A: collateral $200、entry $100k、mark $200k
- B: collateral $20、entry $100k、mark $200k
- C: collateral $200、entry $100k、mark $150k
- D: collateral $200、entry $100k、mark $250k
(答え: B → A → D → C。B は 10× leverage の profitable winner で最高。key intuition は leverage が PnL ランキング上の multiplier である こと — これこそ Hyperliquid が product 慣例として採る理由だ。正確な順序は L1 で score を実装して検算する。)
深掘り — capacity が layer ごとに落ちる cascade
┌─ Layer 1 + 1.5: Detectors ────────────────────────────────┐
│ margin classify + scanner → ScanReport { unfilled_deficit: D } │
└────────────────────────────────────────────────────────────┘
│ D > 0 なら
▼
┌─ Layer 2: Buffer (capacity = fund balance) ───────────────┐
│ insurance fund が min(D, fund_balance) を吸収 → D' │
└────────────────────────────────────────────────────────────┘
│ D' > 0 なら
▼
┌─ Layer 3: Fallback (capacity = ∑ winners' PnL) ───────────┐
│ ADL が min(D', ∑PnL) を吸収 → D'' ← 本コース │
└────────────────────────────────────────────────────────────┘
│ D'' > 0 なら
▼
┌─ Layer 4: Last resort (in-system capacity なし) ──────────┐
│ protocol policy: chain を halt · residual を accept │
└────────────────────────────────────────────────────────────┘
Deficit は単調に shrink する: D ≥ D' ≥ D'' ≥ 0
各 layer の residual が次 layer の入力になる。情報フローは downstream-only — どの layer も上を読まない。
5レッスンのロードマップ
- レッスン1:
AdlScore/AdlRecord/AdlReport+adl_score— 型語彙と pure な ranking 関数。 - レッスン2:
execute_adl— 5 フェーズの orchestration 中枢。 - レッスン3: 6 つの nuanced absorption テスト — マトリクスで証明。
- レッスン4: 5 つの invariant proptest + Liquidation〜ADL四部作の振り返り。
最終的に openhl ADL参照実装パート d66b44a に対して バイト単位で 一致する。
合格基準
- ADL のトリガー(
unfilled_deficit > 0)と cascade 上の位置(Layer 3)を言える。 - score 慣例(
pnl_pct × leverage、高 leverage が先に haircut)を説明できる。 - なぜ orderbook を避けるか(feedback-loop crash)を 1 文で言える。
まとめ(3行)
- ADL は cascade の Layer 3。保険基金が吸収しきれなかった赤字の最終防衛線。
- profitable winner を
pnl_pct × leverageでランクし、帳簿を直接書き換えて haircut する。 - 全体は保存則
deficit_absorbed + deficit_remaining == input_deficitで bound される。