FABRKNT
Step 6. ADL — auto-deleveraging、safety-net cascade の Layer 3
Orientation
レッスン 1 / 5·CONTENT15 分50 XP
コース
Step 6. ADL — auto-deleveraging、safety-net cascade の Layer 3
レッスンの役割
CONTENT
順序
1 / 5

レッスン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 される。