Bot DeFi bot DEX 開発ログ

🛠️開発記録#564(2026/9/8) 清算脆弱性研究でOracleを分解する|Pendle→Morphoの担保評価経路を観測機に組み込む

こんにちは、よだかです。

Morpho × Pendleを中心に、DeFiの清算脆弱性を継続的に観測するための研究を進めています。

このテーマにおける前回の更新では、

「清算まであと1%」と言っても、その1%をどこから測るかで意味が変わる

という問題を整理しました。

Morphoが最終的に使っている担保評価価格から清算ラインまでの距離と、実際に価格が形成される市場から清算までの距離は同じではありません。

この部分は過去の記事で扱っているため、今回は繰り返しません。

関連記事
🛠️開発記録#562(2026/9/6)清算脆弱性研究の更新「清算構造の距離」を考える

続きを見る

また、研究の起点となったPT-reUSDの清算事象や、Morpho上のPT担保市場を横断して観測対象を広げた過程についてはこちらにまとめています。

関連記事
🛠️開発記録#560(2026/9/3) DeFi清算をbot開発の研究テーマに変えるまで

続きを見る

今回の更新点は、その続きです。

一言でまとめると、

Morphoが参照するOracle(オラクル)を一つの価格情報として扱うのをやめ、価格の作り方・比較方法・変換方法・参照経路まで分解して観測機へ組み込んだ

という内容です。


Oracleは「価格の参照先」だけではなかった

これまでもOracleについては、

外部やオンチェーン上の価格情報を取得し、Morphoが担保評価に使う価格を返す仕組み

という程度には捉えていました。

これは間違いではありません。

ただし、清算までの距離を測る目的では粒度が足りませんでした。

今回対象にしているPendle PT(Principal Token。満期になると対応する原資産へ1対1で償還される「元本部分」を表すトークン)を担保にしたMorpho市場では、概念的には次のような経路があります。

Morpho側から見れば、Oracleコントラクトが返す最終価格を使えば清算判定はできます。

一方、研究側で知りたいのは、

その最終価格が、何を参照し、どのような計算や選択を経て作られたのか

です。

ここを分解しないと、

Pendle側の価格が1%変化した
だからMorphoの担保評価も直ちに1%変化する

とは言えません。


PTの評価には、市場を参照する方法と時間から計算する方法がある

Pendleの公式資料では、PTを評価するOracleとして大きく2つの方式が用意されています。

一つは**TWAP型(Time-Weighted Average Price。一定期間の市場情報を使い、瞬間的な価格変動ではなく期間を通した平均的な評価を得る方式)**です。

Pendleでは、PTとSY(Standardized Yield。利回りを生む資産をPendle内で共通形式として扱うためのトークン)の取引市場から得られる情報を使い、一定期間のPT評価をオンチェーンで算出できます。

これは本記事では市場参照型と呼びます。

もう一つが、公式名称でいうLinear Discount Oracleです。

こちらはPendle市場の現在価格を直接参照しません。

PTの満期、現在時刻、あらかじめ設定された年間割引率から、満期までの残り時間に応じた評価係数を計算します。

本記事では、理解しやすさを優先して時間割引型と呼びます。

ここで、Linear Discount Oracleが返す値について補足します。

これは、

「PTは現在0.97ドルです」

というUSD建て価格を直接返しているわけではありません。

返しているのは、

満期に1として償還されるPTを、現在はその何割として評価するか

という倍率です。

例えば、現在の評価を満期価値の97.5%とするなら、

評価係数 = 0.975

です。

ただしEthereumのスマートコントラクトでは、小数をそのまま扱うのではなく整数へ変換して計算することが一般的です。

Linear Discount Oracleでは1.0を、

1,000,000,000,000,000,000

として扱います。

つまり小数点以下18桁分を整数として持っています。

そのため0.975なら、

975,000,000,000,000,000

に相当します。

「18桁精度の係数」というのは、この数値表現を指しています。

重要なのは桁数そのものではなく、

Linear Discount Oracleが返しているのはドル価格ではなく、満期価値を1としたときの現在の評価倍率である

という点です。

この倍率を、必要に応じて別の価格情報や桁合わせと組み合わせることで、最終的にMorphoが使える担保評価価格へ変換します。

Pendle公式では、このLinear Discount Oracleを、外部市場データを使わずblock.timestamp、つまりブロックチェーン上の現在時刻をもとに決定論的に計算する方式として説明しています。

同じPTであっても、市場由来の価格を使う場合と、時間経過から作られた評価値を使う場合では、価格変動が清算ラインへ伝わる仕組みが異なります。


複数の評価方法から「どれを使うか」を決める仕組みもある

さらに、価格の作り方が複数存在するだけではありません。

複数の評価値を受け取ったあと、どの値を採用するかを決める仕組みもあります。

今回確認した代表例が、Ojoの**Pendle Risk Engine(Pendle PTをレンディング担保として評価するためのリスク評価ロジック)**です。

Ojoの公式資料では、PTの評価方法として、

  • Pendle市場由来のTWAP
  • Linear Discountによる評価

の2つを価格入力として受け取り、低い方を出力する設計が説明されています。

つまり、

市場参照型の評価 ─┐
          ├→ 低い方を採用 → 担保評価へ
時間割引型の評価 ─┘

という構造です。

Ojoは、この仕組みを貸し手側に対して保守的なPT評価を行い、潜在的な不良債権リスクを抑えるためのRisk Engineとして説明しています。

本記事では、この役割を保守的比較型と呼びます。

例えば市場由来の評価値が時間割引型より高い間は、市場価格が少し下落しても、Morpho側の担保評価へ同じ幅で直ちに伝わるとは限りません。

市場由来の値が時間割引型の評価を下回って初めて、市場側の価格経路が担保評価を直接決める状態になる場合があります。

そのため、

現在どの価格元が担保評価を決めているか

も、清算までの距離を測るための変数になります。


価格ではなく「どの経路を使うか」を切り替える仕組みもある

もう一つ確認したのが、Steakhouse FinancialのMetaOracleDeviationTimelockです。

これは複数の価格から単純に低い方を選ぶ仕組みではありません。

通常使用するOracleと予備のOracleを持ち、両者の乖離、一定の待機時間、外部トランザクションによる状態変更を経て、現在使用する価格経路を切り替えます。

今回確認した実装でも、

  • Primary Oracle(通常使用する価格経路)
  • Backup Oracle(予備の価格経路)
  • Current Oracle(現在実際に採用されている経路)
  • 乖離の判定条件
  • 切替を申請する処理
  • 一定の待機時間

といった状態を持っていました。

本記事では、この役割を参照経路切替型と呼びます。

ここまで分解すると、Oracleを単に、

「どこの価格を見るか」

という仕組みとして捉えるだけでは足りません。

実際には、

どの方法で評価値を作るか

複数の評価値からどれを採用するか

どの価格経路を現在有効にするか

まで含めて、Morphoの担保評価へ接続されています。


ここまでの分類名は、どこまで公式なのか

ここは明確に分けておきます。

公式名称として確認できるものは、主に次です。

  • TWAP Oracle
  • Linear Discount Oracle
  • Pendle Risk Engine
  • MorphoChainlinkOracleV2
  • MetaOracleDeviationTimelock

一方、

  • 市場参照型
  • 時間割引型
  • 保守的比較型
  • 参照経路切替型
  • 価格合成型

という日本語の区分は、公式の分類名称ではありません。

今回の研究で確認した構造を、人間側で整理するために付けた呼称です。

また、「10種類のOracleが公式に定義されている」わけでもありません。

今回研究対象にしている34市場について、

  • 価格入力の数
  • 使っている価格元
  • 桁合わせ
  • 中継・変換コントラクト
  • 比較ロジック
  • MetaOracleの実装差

などをもとに、観測機を実装するための10種類の経路パターンとしてこちらで分類しました。

したがって、

公式には複数種類のOracleや価格評価コントラクトが存在する

今回の研究では、それらの組み合わせを役割ごとに整理し、実装上10パターンに分類した

という関係です。


Morpho側では、複数の価格情報を最終的な担保評価へ変換する

今回の経路で頻繁に登場したのが、公式名称MorphoChainlinkOracleV2です。

これは、Chainlink形式で値を返す複数の価格入力や、必要に応じてERC-4626 Vaultの持分をその裏付け資産へ換算する比率を組み合わせ、Morphoが使う最終価格を算出するOracleです。

より日本語に寄せると、

担保側と借入側について必要な価格情報や換算比率を組み合わせ、「担保1単位が借入資産でいくらに相当するか」を計算する層

と捉えられます。

Morphoの公式実装では、

  • 担保側の価格入力
  • 借入側の価格入力
  • 必要に応じたVault持分から裏付け資産への換算
  • tokenごとの桁数
  • 桁合わせの倍率

を組み合わせて最終価格を返します。

そのため、同じ「PTを担保にしたMorpho市場」であっても、使用する価格入力や換算経路によってOracleの構造は異なります。


Oracleの構造を、実際のブロックデータで再現する

ここからが実装側です。

Oracleコントラクトのアドレスやソースコードを読んで構造が分かっただけでは、継続観測機には載せていません。

今回の手順は次のようにしました。

先行して6市場でこの経路を詳細に確認し、その後、研究対象としていた34市場へ広げました。

34市場はOracle構造から10種類の経路パターンに分類しています。

そのうえで各市場自身のOracle設定や価格入力を使い、同一ブロック上で価格元からMorphoの最終担保評価までを再計算しました。

現在は、

  • 研究対象:34市場
  • Oracle経路:10パターン
  • 経路解読ロジック:10 / 10実装
  • 個別市場の検証:34 / 34
  • 同一ブロックでの価格再現:34 / 34
  • Oracle価格の不一致:0

まで確認した状態で、34市場を対象に24時間観測を開始しています。

ここで確認しているのは、

Oracleの構造を説明できるか

だけではなく、

実際のオンチェーン状態を使って、その時点でMorphoが使う担保評価価格を再現できるか

です。


一度、「見えない」と「今の観測機では見えない」を混同した

今回の実装では、一度34市場のうち6市場だけを長時間観測へ載せました。

残り28市場は、その時点の観測機が要求していた粒度までOracle経路を解読できていなかったためです。

ただし、その後の監査でこの判定を修正しました。

問題は、

現在の観測機が対応していない

ことと、

技術的に観測できない

ことを同じ扱いにしていた点です。

追加で調べると、残り28市場もOracleアドレスや価格入力の構造は途中まで取得できていました。

不足していたのは、

  • 価格元が何の値を返しているのか
  • 何を何建てで評価しているのか
  • 桁数や倍率をどう処理するのか
  • どの計算を通してMorphoの最終価格になるのか
  • 現在の観測機にその経路解読ロジックが実装されているか

という部分でした。

そこで現在は、

  1. 研究対象か
  2. 技術的に観測可能か
  3. 現在の観測機が対応しているか

を別々に管理しています。

この分離後に28市場の経路を追加で解読し、最終的には34市場すべてを継続観測へ載せました。

今回のような探索では、

まだ解読していない

観測できない

を分けて扱う必要があります。


Oracle経路は観測できるようになった。ただし仮説全体はまだつながっていない

現在の状態を日本語で整理すると、

Oracle内部の価格評価経路については、研究対象としている34市場すべてで観測可能性を確認し、継続観測へ載せた。

という段階です。

一方で、

価格が形成される市場から実際の清算、その後の強制的な資金移動までを端から端まで観測する経路は、まだ完成していません。

特に上流では、

Pendleでの実際の取引

プールの瞬間的な価格

TWAPが形成される過程

を、現在のオラクル経路観測機と同じ粒度では保存していません。

Oracleが返した値自体は過去のブロックから再現できるため、変化が確認された区間について、ブロックやトランザクションを後から掘る方針です。

下流では、

清算可能になる

実際に清算される

担保PTが取得される

そのPTがどこへ流れるか

も別の検証が必要です。

現在算出している**「清算可能域に入る借入額」**は、

一定の価格変化によって清算条件を満たすようになる借入額

を表しています。

これは、

実際に清算される金額

でも、

実際に市場へ売却されるPTの量

でもありません。

まして、そのまま取引上の利益を意味するものでもありません。


現在地

現在は34市場版のオラクル経路観測機を24時間観測へ載せています。

現時点では、

  • オラクル経路の観測可能性:確認済み
  • 仮説全体を端から端まで観測する経路:未完成
  • 取引上の優位性:未確認
  • その優位性を実際に取得可能か:未検証

です。

今回作ったのは清算botではありません。

価格評価の元から、Oracle内部の評価ロジック、Morphoの担保評価、借り手の清算距離までを追うための観測機

です。

まず24時間、34市場の状態を継続して取得します。

その結果から、価格元の切替、複数の評価値の乖離、担保評価の変化、清算距離の変化など、次に詳しく検証すべき区間を抽出します。

それでは、また。


参考・一次情報

  1. Pendle Documentation — Oracle Overview
    PT向けTWAP OracleとLinear Discount Oracleの位置づけ、PTの満期償還との関係を確認。
    Pendle Oracle Overview
  2. Pendle Documentation — Spark Linear Discount Oracle (PT)
    Linear Discount OracleがUSD価格そのものではなく、18 decimalsの評価倍率を返す仕様を確認。
    Spark Linear Discount Oracle (PT)
  3. Ojo Documentation — Pendle Risk Engine
    Pendle市場由来のTWAPとLinear Discountを入力し、低い方を返すリスク評価設計を確認。
    Ojo — Pendle Risk Engine
  4. Morpho Labs — MorphoChainlinkOracleV2.sol
    担保側・借入側の価格入力、ERC-4626 Vault換算、桁合わせを組み合わせ、担保を借入資産建てで評価する実装を確認。
    MorphoChainlinkOracleV2.sol
  5. Steakhouse Financial — MetaOracleDeviationTimelock.sol
    通常経路と予備経路、乖離条件、待機時間、challenge / healingを用いた参照経路切替の実装を確認。
    MetaOracleDeviationTimelock.sol

-Bot, DeFi bot, DEX, 開発ログ