morpho-builder について
morpho-builderは、Morphoレンディングプロトコルをアプリに組み込む開発者向けのリファレンススキルです。プロトコルの構成要素とSDKの選択を説明し、Vault v1・v2のABIの違いや高水準SDKによる取引処理を取り上げます。
主な機能
- 01Morpho BlueとVaultの構成ガイド
- 02SDK選択の案内
- 03入金・借入・返済のフロー
- 04Vault v1とv2のABIの違い
- 05オンチェーン読み取りと取引構築
活用シーン
- 01Morphoレンディングアプリの構築
- 02Vaultの入金・出金・移行の実装
- 03市場での担保設定や借入操作の開発
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ morpho-org/ morpho-skills --skill morpho-builderインストール後、Claude Code で/morpho-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/adaptive-curve-irm.mdbad-debt.mdcommon-pitfalls.mddead-deposits.mdslippage.mdtesting-guide.md詳細
Morpho Builder Skill
実験的(v1.0 未満) — プロトコル関連ツールの成熟に伴い、SDK の推奨事項、API スキーマ、ベストプラクティスは変更される可能性があります。
Morpho レンディングプロトコルと統合するアプリケーションを構築するためのリファレンスガイドです。会話中にプロトコルを直接操作する場合は、代わりに morpho-cli スキルを使用してください。
Morpho v2 を優先してください。 Morpho Optimizer(Morpho-Aave、Morpho-Compound)は非推奨です。新しい Vault をデプロイする場合は、MetaMorpho(vault v1)より vault v2 を優先してください。注:2 つの Vault バージョンは 互換性のない ABI を使用しています。v2 Vault には
vaultV2Abiを、v1 Vault にはmetaMorphoAbiを使用してください。オンチェーンコントラクトに合った ABI を選択してください。
プロトコルの概要
Morpho Blue — 分離型レンディング市場です。各市場は、ローントークン、担保トークン、オラクル、金利モデル(IRM)、清算時の LTV(LLTV)の 5 つのパラメーターで定義されます。市場は MarketId(これらのパラメーターのハッシュ)によって識別されます。
Morpho Vaults v2 — 新しい Vault コントラクトです。ERC-4626 に準拠しています。アダプターを介して複数の市場に預け入れ資産を割り当てます。アダプターは MetaMorpho(v1)Vault と Morpho Blue 市場をラップできます。新しい Vault のデプロイにはこちらが推奨されます。SDK では vaultV2Abi、VaultV2、fetchVaultV2 を使用します。
MetaMorpho(vault v1) — 従来の Vault コントラクトです。現在も機能し、オンチェーンで広くデプロイされています。SDK では metaMorphoAbi、Vault、fetchVault を使用します。2 つの Vault バージョンは互換性のない ABI を使用しているため、操作するコントラクトに合ったものを使用してください。
シングルトンコントラクト:0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb — CREATE2 により、Ethereum(chain 1)と Base(chain 8453)で同じアドレスです。
主なエンティティ
| エンティティ | 識別子 | 説明 |
|---|---|---|
| 市場 | MarketId | 特定の担保/ローンのペアを持つ分離型レンディングプール |
| Vault | Address | 複数市場のアグリゲーター、ERC-4626。2 つのバージョンがあります:v2(VaultV2)と MetaMorpho v1(Vault)。ABI は異なります |
| ポジション | ユーザー + 市場/Vault | 市場でのユーザーの供給/借入、または Vault への預け入れ |
| トークン | Address + decimals | ERC-20 — decimals は異なります(USDC/USDT = 6、WETH/DAI = 18) |
主な数量
| 数量 | 形式 | 注記 |
|---|---|---|
| APY | 小数(0.0534 = 5.34%) | GraphQL の state.netApy から取得 |
| LLTV | 生の 1e18 値(860000000000000000 = 86%) | SDK または API から取得 |
| トークン量 | 生の単位 | 人間が読みやすい値にするには 10^decimals で割ります。viem の parseUnits/formatUnits を使用してください |
| ヘルスファクター | 比率 | ≥ 1.0 = 安全、< 1.0 = 清算可能 |
SDK の選択
ユーザー向けのフローでは、デフォルトで @morpho-org/morpho-sdk を使用してください。 これは blue-sdk、blue-sdk-viem、bundler-sdk-viem、simulation-sdk をラップする高レベルの抽象化レイヤーです。バンドラー経由と直接実行の切り替え、スリッページの上限、借入時の LLTV バッファーによる健全性チェック、ERC-20 の承認/EIP-2612 の許可/Permit2/Morpho の setAuthorization 要件、ネイティブトークンのラップをすべて内部で処理します。低レベルの SDK からこれらを手動で組み立てると、エラーが起きやすく、morpho-sdk がすでに正しく処理しているロジックを重複して実装することになります。
morpho-sdk を使用するケース: Vault の入金/出金/引き換え(V1 および V2)、VaultV2 の強制出金/強制引き換え、V1→V2 の移行、Morpho Blue の supplyCollateral、borrow(任意の PublicAllocator による再配分を含む)、アトミックな supplyCollateralBorrow、repay(資産またはシェア単位)、withdrawCollateral、アトミックな repayWithdrawCollateral、およびエンティティごとの読み取り(getData、getMarketData、getPositionData)。
低レベルの SDK に切り替えるのは、次の場合に限ります:
- Vault のキュレーター/アロケーター/オーナーの操作(setCap、再配分、ロール管理、タイムロック、guardian/sentinel のフロー)
- Morpho Blue マーケットの作成
- 清算、フラッシュローン、事前清算、報酬の請求
- 上記のアクション以外の、カスタムバンドラー構成
- 多数のマーケット/Vault を対象としたポートフォリオ全体の集計(morpho-sdk が提供するのはエンティティごとの読み取りのみです。
blue-sdk-viemのフェッチヘルパーまたは GraphQL API を使用してください)
React/wagmi アプリ: @morpho-org/morpho-sdk-wagmi パッケージはありません。読み取りには @morpho-org/blue-sdk-wagmi のフックを使用し、書き込みには wagmi のパブリッククライアントを指定して MorphoClient をインスタンス化し、buildTx の出力を wagmi の useSendTransaction に渡してください。
SDK の一覧
すべてのパッケージは npm の @morpho-org 配下で公開されています。
| パッケージ | 用途 |
|---|---|
@morpho-org/morpho-sdk | まずはこちらを使用してください。 以下の 4 つの SDK をラップする高レベルの抽象化です。スリッページ、承認、許可、バンドラー経由の処理を内部で行いながら、ユーザー向けのトランザクション(入金、借入、返済、出金、移行)を構築します |
@morpho-org/blue-sdk | コア型、エンティティクラス(Market、Vault、VaultV2、Position、MarketParams)、定数を提供します。morpho-sdk の内部で使用されます。型のインポートまたは未対応のフローに限り、直接使用してください |
@morpho-org/blue-sdk-viem | Viem の拡張機能です。ABI、フェッチヘルパー(fetchMarket、fetchVault、fetchVaultV2、fetchPosition)を提供します。morpho-sdk の内部で使用されます。ABI、複数エンティティの読み取り、または未対応の書き込みフローに直接使用してください |
@morpho-org/bundler-sdk-viem | 複数ステップのトランザクションをバンドルします(承認、転送、Morpho の操作を 1 つの tx にまとめます)。morpho-sdk の内部で使用されます。morpho-sdk のアクションセット以外のカスタム構成に限り、直接使用してください |
@morpho-org/simulation-sdk | Morpho 操作のフレームワーク非依存シミュレーションを提供します。morpho-sdk の内部で使用されます。単体の what-if シミュレーションに限り、直接使用してください |
@morpho-org/blue-sdk-ethers | Ethers の拡張機能です。Viem と同じフェッチヘルパーを Ethers ベースのプロジェクト向けに提供します |
@morpho-org/blue-sdk-wagmi | コア SDK をラップする React フック(useMarket、useVault、usePosition など)を提供します。wagmi v2 が必要です。書き込みには morpho-sdk と併用してください |
@morpho-org/blue-api-sdk | Morpho API 用の型付きクエリを備えた GraphQL SDK |
@morpho-org/simulation-sdk-wagmi | クライアント側シミュレーション用の React フック(useSimulationState) |
@morpho-org/liquidity-sdk-viem | 流動性の監視およびボットの基盤 |
@morpho-org/liquidation-sdk-viem | 清算ボットの基盤 |
@morpho-org/migration-sdk-viem | Aave/Compound から Morpho への移行 |
@morpho-org/morpho-ts | 時刻およびフォーマットのユーティリティ |
@morpho-org/test | Morpho 用の Vitest/Anvil テストフィクスチャ |
@morpho-org/test-wagmi | @morpho-org/test を拡張した Wagmi テスト設定 |
@morpho-org/morpho-test | フレームワーク非依存のテストフィクスチャ |
SDK の詳細
@morpho-org/morpho-sdk
高水準の抽象化です。ユーザー向けフローのデフォルトのエントリーポイントです。
構築 — 同等の形式が2つあります。new MorphoClient(publicClient) は直接クライアントを返します。また、publicClient.extend(morphoViemExtension()) は API を viem のパブリッククライアントに .morpho として追加します。
エンティティファクトリー — すべて chainId が必要です(Ethereum は 1、Base は 8453)。
| ファクトリー | 戻り値 | 用途 |
|---|---|---|
morpho.vaultV2(address, chainId) | MorphoVaultV2 | Vault V2(新規デプロイで推奨) |
morpho.vaultV1(address, chainId) | MorphoVaultV1 | MetaMorpho(vault v1) |
morpho.marketV1(marketParams, chainId) | MorphoMarketV1 | Morpho Blue マーケット |
読み取り — 各エンティティは getData() に加え、該当する場合は getMarketData() / getPositionData(user) を公開します。アクションの構築に必要な、最新のオンチェーン状態を返します。
アクション — 各アクションは { buildTx, getRequirements } を返します。
| エンティティ | アクション |
|---|---|
MorphoVaultV2 | deposit、withdraw、redeem、forceWithdraw、forceRedeem |
MorphoVaultV1 | deposit、withdraw、redeem、migrateToV2 |
MorphoMarketV1 | supplyCollateral、borrow、repay、withdrawCollateral、supplyCollateralBorrow、repayWithdrawCollateral、および PublicAllocator 用の getReallocationData / getReallocations |
標準的な書き込みパターン:
MorphoClientとエンティティ(vault または market)を構築します。- 最新の状態を取得します。vault の場合は
await entity.getData()、market の場合はawait market.getMarketData()+await market.getPositionData(user)を呼び出します。 - アクションを呼び出します。
const { buildTx, getRequirements } = await entity.deposit({ amount, userAddress, accrualVault })。 - 要件を解決します。
const reqs = await getRequirements()を呼び出すと、必要に応じて ERC-20 の承認、EIP-2612 の許可、Permit2 データ、および/またはmorpho.setAuthorization(GA1, true)の手順が返されます。 - 要件に従って許可に署名するか、承認トランザクションを送信します。
- 構築して送信します。
const tx = buildTx(requirementSignatures)→{ to, value, data, action }→ 署名してブロードキャストします。
注意事項:
- スリッページ — morpho-sdk はオンチェーン状態から
maxSharePrice/minSharePriceの上限・下限を自動的に計算します。デフォルトの許容幅は 3 bps で、上限は 10% です。より厳しい、または緩い上限・下限が必要な場合は、アクションの slippage オプションで上書きできます。 - 借入の健全性 —
borrowとsupplyCollateralBorrowは、渡されたポジションスナップショットを使用して LLTV バッファーを自動的に適用します。借入アクションを呼び出す直前に、必ず最新のpositionDataを取得してください。 - ネイティブ ETH — deposit/borrow アクションに
nativeAmountを渡すと、単一のトランザクションでラップと供給をアトミックに実行できます。 - アナリティクス — 各アクションの省略可能な
metadataフィールドを使うと、アトリビューション用にトランザクションにタグを付けられます。 - wagmi ラッパーなし — morpho-sdk は viem 専用です。React では、wagmi のパブリッククライアント(
usePublicClient())を使ってMorphoClientを構築し、buildTxの出力をuseSendTransactionに渡してください。
@morpho-org/blue-sdk
型、エンティティクラス、定数を提供します。
Market— 操作メソッド(.supply()、.borrow()、.repay()、.withdraw())と変換メソッド(.toSupplyAssets()、.toBorrowAssets())を持つクラスMarketParams—new MarketParams({ loanToken, collateralToken, oracle, irm, lltv })MarketId— market を識別するブランド型Position—new Position({ supplyShares, borrowShares, collateral })VaultV2— vault v2 のエンティティクラス(新規インテグレーションで推奨)Vault— MetaMorpho(vault v1)のエンティティクラスVaultConfig— MetaMorpho の vault 用設定クラス
@morpho-org/blue-sdk-viem
ABI、取得ヘルパー、viem の拡張機能です。
ABI カタログ — ABI JSON を手作業で作成する代わりに、以下をインポートしてください。
| エクスポート | コントラクト |
|---|---|
blueAbi | Morpho Blue シングルトン |
vaultV2Abi | Vault v2(新規デプロイでの推奨) |
vaultV2FactoryAbi | Vault v2 ファクトリー |
metaMorphoAbi | MetaMorpho/vault v1(既存の v1 vault に使用) |
metaMorphoFactoryAbi | MetaMorpho ファクトリー/vault v1 |
erc2612Abi | ERC-2612 permit |
permit2Abi | Uniswap Permit2 |
wstEthAbi | Wrapped stETH |
adaptiveCurveIrmAbi | Morpho の adaptive curve IRM |
blueOracleAbi | Morpho オラクル |
取得ヘルパー — fetchMarket、fetchVaultV2(v2)/fetchVault(v1)、fetchPosition は、オンチェーンの状態を SDK のエンティティオブジェクトに読み込みます。オンチェーンの vault のバージョンに対応する取得ヘルパーを使用してください。エンティティのメソッドには、market.toSupplyAssets()、vault.toShares() などがあります。
@morpho-org/blue-sdk-wagmi
コア SDK をラップする React フックです。wagmi v2 が必要です。
フック:useMarket、useVault、usePosition、useToken、useHolding、useMarkets、useVaults、usePositions、useTokens、useHoldings、useVaultMarketConfig、useVaultMarketConfigs、useVaultUser、useVaultUsers、useMarketParams に加え、複数形のバリアントがあります。
@morpho-org/simulation-sdk + @morpho-org/simulation-sdk-wagmi
Morpho 操作のクライアント側シミュレーションです。useSimulationState フックは、トランザクションを送信せずに UI プレビュー用のシミュレーション後の状態を提供します。
GraphQL API
エンドポイント:https://api.morpho.org/graphql
主要なクエリ:vaults(フィールド:address、name、symbol、asset、state.netApy、state.totalAssets)と markets(フィールド:uniqueKey、loanAsset、collateralAsset、state.supplyApy、state.borrowApy、state.utilization、lltv)。
フィルターとページネーション
| フィルター | 例 | 説明 |
|---|---|---|
chainId_in | [1]、[8453]、[1, 8453] | 必須 — 常にチェーンを指定します |
assetSymbol_in | ["USDC"] | アセットシンボルで絞り込みます |
address_in | ["0x..."] | vault アドレスで絞り込みます |
uniqueKey_in | ["0x..."] | マーケット ID で絞り込みます |
userAddress_in | ["0x..."] | ユーザーのポジションで絞り込みます |
first と skip を使ってページネーションします。items.length < first になるまで繰り返します。
値の解釈
| フィールド | 形式 | 変換方法 |
|---|---|---|
netApy / supplyApy / borrowApy | 小数 | 0.0534 = 5.34% |
totalAssets | 生の文字列 | 10^asset.decimals で割ります |
lltv | 生の 1e18 文字列 | パーセンテージにするには 1e18 で割ります |
インテグレーション方法
- バックエンド/スクリプト/ボット(viem) — デフォルトでは、
@morpho-org/morpho-sdkのMorphoClient(publicClient)を使用します。複数のエンティティにまたがる読み取りや、morpho-sdk で提供されていない操作の場合に限り、@morpho-org/blue-sdk-viemの取得ヘルパーと ABI を直接使用します。 - フロントエンド(React + wagmi) — リアクティブな読み取りには、
@morpho-org/blue-sdk-wagmiのフック(useVault、usePositionなど)を使用します。書き込みには、usePublicClient()を使ってMorphoClientを構築し、morpho-sdk でトランザクションを作成してから、wagmi のuseSendTransactionで送信します。@morpho-org/morpho-sdk-wagmiはありません。 - 高度な操作(キュレーター業務、マーケット作成、清算、フラッシュローン、報酬) — morpho-sdk はこれらをカバーしていません。
@morpho-org/blue-sdk-viemの ABI と、対象のサブ SDK(@morpho-org/liquidation-sdk-viem、@morpho-org/liquidity-sdk-viem、@morpho-org/migration-sdk-viem)を組み合わせて使用します。
プロトコルの仕組み
デッドデポジット(インフレ攻撃対策)
ERC-4626 ボールトは、初回入金時にシェア価格のインフレ攻撃を受ける可能性があります。デッドデポジット(バーンアドレス 0x000000000000000000000000000000000000dEaD へのシェアのミント)は、新しいボールトまたはマーケットで最初に行うトランザクションでなければなりません。その前にユーザーが入金すると、攻撃が可能になります。
Vault V2 — 目標シェア数はアセットの小数桁数によって異なります。
計算式:targetShares = max(1e9, 10^(6 + max(0, 18 - decimals))) — 小数桁数が18のアセット:1e9、8のアセット:1e16、6のアセット:1e18。vault.mint(TARGET_SHARES, 0xdead) を呼び出します。
Market V1 — 小数桁数にかかわらず、シェア数は常に 1e9 です。morpho.supply(marketParams, 0, 1e9, 0xdead, "") を呼び出します。
Vault V1 — 標準は 1e9 シェアです。小数桁数が9未満のトークンには 1e12 を使用します。
アクティブキャップの要件:Vault V2 が基盤となるマーケット/ボールトを参照する場合、0xdead は以下も保有している必要があります。
- キャップがゼロでない各 Market V1 で
1e9の supplyShares - キャップがゼロでないか、出金キューに含まれる各 Vault V1 で
1e9シェア
AdaptiveCurveIRM
Morpho の承認済み IRM は、次の2つの仕組みを組み合わせています。
- カーブ — 利用率の変化に応じて金利を即座に調整します(例:利用率が90%から0%に変わると、金利は4倍または1/4になります)。
- 適応機能 — 利用率が一定期間続いた状況に基づき、目標金利を継続的に変化させます。
| 利用率 | 金利の動作 |
|---|---|
| 0% | 約5日ごとに半減 |
| 90%(目標) | 安定 |
| 100% | 約5日ごとに倍増 |
運用上の警告:利用率100%は避けてください。金利が急激に複利で増加します。マーケット作成直後に初期供給を行ってください。空のマーケットでは利用率が0%となり、自動的に金利が低下します。
スリッページとシェア/アセットの変換
アセットとシェアの交換レートは、トランザクションの準備からオンチェーンでの実行までの間に変わる場合があります。適切なデッドデポジットがあれば、これはセキュリティ上の脆弱性ではなく、UX 上の懸念事項です。ただし、インテグレーションでは引き続きユーザーを保護する必要があります。
防御パターン: @morpho-org/morpho-sdk を使用すると、スリッページの上限(maxSharePrice/minSharePrice、デフォルトは3 bps、上限は10%)が自動的に計算・適用されるため、手動で preview と許容範囲を配線する必要はありません。blue-sdk-viem/bundler-sdk-viem を直接使用する場合に限り、次のパターンを独自に実装してください。previewDeposit() を呼び出してシェア数を見積もり、許容範囲を適用した下限値(例:1%)を設定し、実際の結果がその最小値を満たしていることを確認します。
全額出金:残高の端数が残らないよう、withdraw() ではなく redeem() を使用してください。
Vault V2 の注意点:maxDeposit、maxMint、maxWithdraw、maxRedeem は常にゼロを返します。容量の確認にこれらを使用しないでください。
不良債権の追跡
- V1.0:即座に実現されます。影響を受けるマーケットのすべての供給者について、シェア価格がアトミックに下落します。不良債権の実現をフラッシュローンで増幅される脆弱性があります。
- V1.1+:
lostAssetsフィールドで追跡されます。明示的に実現されるまで、シェア価格には影響しません。フラッシュローンによる操作を防ぎます。
よくある落とし穴
| 落とし穴 | 結果 | 防止策 |
|---|---|---|
| デッドデポジットの不足 | インフレ攻撃/シェア価格の操作 | ユーザーのデポジット前に、0xdead にシェアをシードする |
全額引き出しに withdraw() を使用 | ポジションに端数が残る | 全額引き出しには redeem() を使用する |
| オラクルリスクの見落とし | 古い価格や操作された価格による清算 | 市場を統合する前に、オラクルの種類、鮮度、既知のリスクを確認する |
| ERC4626 Vault を担保として使用 | シェア価格の操作(Cream ハック型) | V1.0 Vault を担保として使用しない。バッドデットの実現がない V1.1 以降のほうが安全 |
| ERC4626 Vault をローン資産として使用 | 清算インセンティブが予測不能になる | ローン資産として ERC4626 Vault を一切登録しない |
| Vault ガバナンスを無視 | オーナー/キュレーターがリスクの高い市場へ再配分できる | ロール保持者を監査し、信頼に関する前提をユーザーに明示する |
安全性に関する注意事項
アドレス:GraphQL API または SDK の取得ヘルパーを使って確認します。使用前に候補をユーザーに提示し、確認を得てください。Vault、マーケット、トークンのアドレスをハードコードしてはいけません。
チェーン:常にパラメーター化し、チェーンを関数パラメーターとして受け取ります。Ethereum または Base を前提としてはいけません。Morpho は両方のチェーンで同じシングルトンアドレスにデプロイされています。
書き込みフロー:すべての書き込み操作は、クエリ → 準備 → シミュレーション → 確認 → 実行の手順に従います。リバートを早期に検出できるよう、実行前にトランザクションをシミュレーションします。サーバーは署名されていないトランザクションを返します。署名はアプリが処理します。
トークンの小数桁数:USDC/USDT は 6 桁、WETH/DAI は 18 桁です。API またはコントラクトから decimals を読み取ってください。18 桁と決めつけてはいけません。変換には parseUnits(amount, decimals) を使用します。
USDT の承認に関する注意点:新しい値を設定する前に、アローワンスを 0 にリセットする必要があります。USDT の場合に条件付きで実行するか、常にリセットしてから設定するパターンを実装してください。
DAI の permit:標準仕様とは異なります。EIP-2612 permit ではなく、ERC-20 の approve() を使用します。
ヘルスファクター:借り入れ操作では、予定している借り入れ後のヘルスファクターを検証します。ポジションが危険な状態(ヘルスファクター < 1.0)になる場合は、処理を続行しないでください。約 1.1 の場合は警告してください。
デッドデポジット:Vault またはマーケットの作成時には、最初のトランザクションとしてデッドデポジットを含める必要があります。上記の「プロトコルの仕組み > デッドデポジット」を参照してください。
テスト
@morpho-org/test— Morpho 固有のテストセットアップ用の Vitest/Anvil フィクスチャです。- Vault、マーケット、入力検証、ヘルスファクター、トークン承認、署名セキュリティ、バッドデットを網羅するテストケースの一覧は、テストガイドを参照してください。実装では、これらのチェックをテストスイートに含めてください。
ベストプラクティス
ユーザー向けのフローでは @morpho-org/morpho-sdk を優先する:MorphoClient は、スリッページ上限、承認/permit/Permit2/GA1 認可、借り入れ時の LLTV バッファーに基づくヘルスチェック、バンドラーへのルーティングを一元管理します。morpho-sdk で操作を利用できない場合(キュレーター操作、マーケット作成、清算、フラッシュローン、報酬、カスタムのバンドラー構成)に限り、@morpho-org/blue-sdk-viem と @morpho-org/bundler-sdk-viem を使って手動で実装してください。対応範囲の一覧は、上記の「SDK の選択」を参照してください。
新規デプロイでは vault v2 を優先する:新しい Vault を作成する場合は、MetaMorpho(v1)より vault v2 を優先してください。既存の Vault を操作する場合は、オンチェーンのコントラクトに合わせて ABI を選択します。v2 には vaultV2Abi、v1 には metaMorphoAbi を使用してください。これらは相互に置き換えられません。
Morpho Optimizer より Morpho Blue を優先する:従来の Morpho Optimizer(Morpho-Aave、Morpho-Compound)は非推奨です。新しい統合では、Morpho Blue のコントラクトと SDK を優先してください。
Bundler3 は使用しない:非推奨です。新しいコードで参照してはいけません。
ABI:常に @morpho-org/blue-sdk-viem からインポートしてください。ABI の JSON を手書きしてはいけません。
実装後のレビュー
コードまたは計画の作成が完了したら、結果を提示する前に、以下のMorpho固有のチェック項目に照らしてレビューします。それぞれに、CRITICAL(資金の損失)、WARNING(UXの不具合)、またはN/Aのいずれかを記します。
- SDKの選択 — 標準的なユーザー向けフロー(入金、借入、返済、出金、移行、担保の供給/引き出し)では、手作業で構成した
blue-sdk-viem+bundler-sdk-viem+simulation-sdkの組み合わせではなく、@morpho-org/morpho-sdk(MorphoClient)を使用します。手作業の実装がmorpho-sdkの適用するはずの安全策(スリッページ上限、借入時のLLTVバッファー、USDTのアローワンスのリセット、GA1の承認)を省略している場合はCRITICAL、対応済みフローの単なる重複実装である場合はWARNINGとします。 - デッドデポジット保護 — Vault/マーケットの作成では、最初のトランザクションとして
0xdeadへのデッドデポジットを含めます。バージョンに応じた正しい計算式を使用します(リファレンス)。 - スリッページ保護 — morpho-sdkは許容範囲を自動的に処理します。下位レベルのSDKを直接使用する場合、入金/出金にはプレビュー関数と許容範囲チェックを使用します。全額引き出しには
withdraw()ではなくredeem()を使用します。Vault V2のmax*関数に依存しません(リファレンス)。 - IRMの考慮 — 新しいマーケットは速やかに初期流動性を供給します。利用率が100%の状態が長時間続かないようにします。APYの計算式が正しいことを確認します(リファレンス)。
- 不良債権への安全対策 — V1.0 Vaultを担保にしません。ERC4626 Vaultをローン資産にしません。ダッシュボードに
lostAssetsを表示します(リファレンス)。 - トークンの承認 — USDTでは最初にアローワンスを0にリセットします。DAIでは
permit()ではなくapprove()を使用します(morpho-sdkは要件フローを通じて両方を自動処理します。手作業による統合ではこれらを実装する必要があります)(リファレンス)。 - Vaultのガバナンス — UIにロール保持者を表示します。信頼に関する前提を文書化します(リファレンス)。
- 一般的な安全対策 — アドレスをハードコードしません。チェーンIDをパラメーター化します。小数桁数は仮定せずに読み取ります。書き込み操作は実行前にシミュレーションします。ヘルスファクターを検証します。ABIには
@morpho-org/blue-sdk-viemのものを使用します。 - テストカバレッジ — 実装にはテストガイドの該当ケースに対するテストを含めます。エッジケース(デッドデポジット、USDTの承認、ヘルスファクターの境界、
redeem()による全額引き出し)をカバーします。