DeFi プロトコル開発スキル。AMM・流動性プール、レンディング、 価格オラクル、Vault(ERC4626)の設計パターンを提供する。 ユーザーが "DeFi", "AMM", "DEX", "レンディング", "Vault", "流動性プール", "オラクル", "solidity-defi" 等と言った時に使用。
DeFi プロトコル開発における主要パターン(AMM、レンディング、オラクル、Vault)を提供するドメイン特化スキル。
ユーザーの要件から対象ドメインを判定する:
| ユースケース | 対応ドメイン | リファレンス |
|---|---|---|
| トークン交換・流動性提供 | AMM / DEX | references/amm-patterns.md — Constant Product (Uniswap V2)、Concentrated Liquidity (V3)、StableSwap (Curve) から選択 |
| 貸付・借入・清算 | レンディング | references/lending-patterns.md — 金利モデル、担保管理、清算メカニズムを確認 |
| 外部価格データ取得 | オラクル | references/oracle-patterns.md — Chainlink Data Feed、TWAP、複合オラクルから選択 |
| 預入・利回り・戦略 | Vault | references/vault-patterns.md — ERC4626 標準、inflation attack 防御、マルチ戦略 |
複数のドメインが関連する場合(例: Vault + オラクル)は、全ての該当リファレンスを読み込む。
ユーザーの要件が不明確な場合は AskUserQuestion で DeFi の具体的なユースケースを確認する。
検証ゲート: 対象ドメインが上記 4 つのいずれかに該当すること。
Step 1 で特定したリファレンスファイルを読み込み、以下を確認する:
検証ゲート: リファレンスが正常に読み込め、該当パターンが特定できること。
solidity-core の language-patterns.md に従い NatSpec・コーディング規約を適用する。nonReentrant 修飾子minAmountOut, deadline)k >= kBefore)検証ゲート: forge build がエラーなく完了すること。
DeFi 特有のセキュリティリスクを solidity-core の security-checklist.md と合わせて確認する:
latestRoundData で stale check をしているか。nonReentrant を遵守しているか。特に withdraw / redeem 関数。minAmountOut を指定でき、フロントランニングから保護されているか。deadline パラメータでサンドイッチ攻撃のウィンドウを制限しているか。検証ゲート: CRITICAL レベルのセキュリティ問題が 0 件であること。
ユーザー入力: 「シンプルな AMM を作りたい。流動性追加とトークンスワップができるようにして」
アクション:
references/amm-patterns.md を選択src/ConstantProductAMM.sol — Pair コントラクト(x * y = k ロジック、nonReentrant、スリッページ保護)src/interfaces/IAMM.sol — インターフェース定義test/ConstantProductAMM.t.sol — addLiquidity / swap / removeLiquidity のテスト + K 値 invariant テスト結果: スリッページ保護・Reentrancy 防止を備えた AMM とテストスイートが生成される。
ユーザー入力: 「ERC4626 の Vault を作りたい。ETH ステーキングの利回りを分配するもの」
アクション:
references/vault-patterns.md を選択src/StakingVault.sol — OpenZeppelin ERC4626 を継承。virtual shares / virtual assets で inflation attack を防御。deposit / withdraw / redeem 実装test/StakingVault.t.sol — デポジット・引出のテスト + 初回デポジット攻撃の防御テスト + share 計算の Fuzz テスト結果: Inflation attack に耐性のある ERC4626 Vault がテスト付きで生成される。
ユーザー入力: 「ETH/USD の価格を Chainlink で取得して、USD 建ての計算をしたい」
アクション:
references/oracle-patterns.md を選択src/PriceConsumer.sol — AggregatorV3Interface を使用。stale price チェック(updatedAt + 閾値)、negative price チェック、decimals 正規化test/PriceConsumer.t.sol — モックオラクルでテスト。stale price / negative price / decimals 変換のテスト結果: Stale / negative price に対するガードを備えた Chainlink オラクル統合が生成される。
症状: AMM の require(k >= kBefore) でリバート
原因と対策:
require(k >= kBefore - 1) で許容誤差を設定するか、mulDiv 関数で精度を向上させる。症状: require(updatedAt > block.timestamp - STALE_THRESHOLD) でリバート
原因と対策:
STALE_THRESHOLD を heartbeat + バッファ(例: 3600 + 300)に設定する。症状: deposit 後に balanceOf(user) がゼロ
原因と対策:
ERC4626 は v5.x でデフォルトで virtual shares/assets(オフセット = 1)を使用するため、最新版を使用する。decimalsOffset() を確認する。症状: 予想よりも不利なレートでスワップが実行される
原因と対策:
minAmountOut パラメータが 0 に設定されている。フロントエンドで適切なスリッページ(0.5-1%)を計算して設定する。deadline パラメータでトランザクションの有効期限を設定する。block.timestamp + 300(5分)が一般的。症状: withdraw 関数が繰り返し呼び出され、想定以上の資金が引き出される
原因と対策:
token.transfer)の前に状態を更新(残高減算)しているか確認する。Checks-Effects-Interactions の順序を厳守する。nonReentrant 未使用: 全ての資金移動関数に OpenZeppelin の ReentrancyGuard.nonReentrant を適用する。receive() / fallback() からの再帰呼び出しに注意する。solidity-core を参照する。web3-frontend を参照する。ERC4626, ReentrancyGuard 等)の利用を推奨し、独自実装は避ける。