solidity-defi
npx skills add https://github.com/stanah/dotagents --skill solidity-defi
Agent 安装分布
Skill 文档
solidity-defi: DeFi ãããã³ã«éçºã¹ãã«
DeFi ãããã³ã«éçºã«ããã主è¦ãã¿ã¼ã³ï¼AMMãã¬ã³ãã£ã³ã°ããªã©ã¯ã«ãVaultï¼ãæä¾ãããã¡ã¤ã³ç¹åã¹ãã«ã
対象
- AMM / DEXï¼Uniswap V2/V3 åãCurve åï¼
- ã¬ã³ãã£ã³ã°ãããã³ã«ï¼Aave / Compound åï¼
- ä¾¡æ ¼ãªã©ã¯ã«çµ±åï¼ChainlinkãTWAPï¼
- Vault / yield æ¦ç¥ï¼ERC4626ï¼
ã¯ã¼ã¯ããã¼
Step 1: DeFi ãã¡ã¤ã³å¤å®
ã¦ã¼ã¶ã¼ã®è¦ä»¶ãã対象ãã¡ã¤ã³ãå¤å®ãã:
| ã¦ã¼ã¹ã±ã¼ã¹ | 対å¿ãã¡ã¤ã³ | ãªãã¡ã¬ã³ã¹ |
|---|---|---|
| ãã¼ã¯ã³äº¤æã»æµåæ§æä¾ | 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 2: ãªãã¡ã¬ã³ã¹èªã¿è¾¼ã¿
Step 1 ã§ç¹å®ãããªãã¡ã¬ã³ã¹ãã¡ã¤ã«ãèªã¿è¾¼ã¿ã以ä¸ã確èªãã:
- 該å½ãã¿ã¼ã³ã®è¨è¨ææ³ã¨å¶ç´æ¡ä»¶
- å¿ è¦ãªã¤ã³ã¿ã¼ãã§ã¼ã¹ï¼ERC4626ãChainlink AggregatorV3 çï¼
- ã³ã¼ãä¾ã®åææ¡ä»¶ï¼Solidity ãã¼ã¸ã§ã³ãä¾åã©ã¤ãã©ãªï¼
æ¤è¨¼ã²ã¼ã: ãªãã¡ã¬ã³ã¹ãæ£å¸¸ã«èªã¿è¾¼ãã該å½ãã¿ã¼ã³ãç¹å®ã§ãããã¨ã
Step 3: ã³ã¼ãçæ
solidity-coreã®language-patterns.mdã«å¾ã NatSpecã»ã³ã¼ãã£ã³ã°è¦ç´ãé©ç¨ããã- DeFi åºæã®ã»ãã¥ãªãã£å¯¾çãçµã¿è¾¼ã:
- å
¨ã¦ã® state-changing 颿°ã«
nonReentrant修飾å - ã¹ãªããã¼ã¸ä¿è·ãã©ã¡ã¼ã¿ï¼
minAmountOut,deadlineï¼ - é©åãªæ°å¤ç²¾åº¦ï¼WAD / RAY / BPSï¼
- å
¨ã¦ã® state-changing 颿°ã«
- ãã¹ãã³ã¼ããåæã«çæãã:
- æ£å¸¸ç³»ï¼swapãdepositãwithdrawï¼
- ç°å¸¸ç³»ï¼ã¹ãªããã¼ã¸è¶ éãæ®é«ä¸è¶³ã権éä¸è¶³ï¼
- Fuzz ãã¹ãï¼æ°å¤å ¥åã®ãã颿°ï¼
- Invariant ãã¹ãï¼ãã¼ã«ã®ä¸å¤æ¡ä»¶:
k >= kBeforeï¼
æ¤è¨¼ã²ã¼ã: forge build ãã¨ã©ã¼ãªãå®äºãããã¨ã
Step 4: DeFi ã»ãã¥ãªãã£ç¢ºèª
DeFi ç¹æã®ã»ãã¥ãªãã£ãªã¹ã¯ã solidity-core ã® security-checklist.md ã¨åããã¦ç¢ºèªãã:
- ãã©ãã·ã¥ãã¼ã³æ»æ: 1 ãã©ã³ã¶ã¯ã·ã§ã³å ã§ã®ä¾¡æ ¼æä½ã«èæ§ãããããTWAP ã使ç¨ãã¦ãããã
- ä¾¡æ ¼æä½: ãªã©ã¯ã«ãã¹ãããä¾¡æ ¼ã®ã¿ã«ä¾åãã¦ããªãããChainlink ã®
latestRoundDataã§ stale check ããã¦ãããã - Reentrancy: CEI ãã¿ã¼ã³ +
nonReentrantãéµå®ãã¦ããããç¹ã«withdraw/redeem颿°ã - ã¹ãªããã¼ã¸ä¿è·: ã¦ã¼ã¶ã¼ã
minAmountOutãæå®ã§ããããã³ãã©ã³ãã³ã°ããä¿è·ããã¦ãããã - MEV 対ç:
deadlineãã©ã¡ã¼ã¿ã§ãµã³ãã¤ããæ»æã®ã¦ã£ã³ãã¦ãå¶éãã¦ãããã - Inflation Attackï¼ERC4626ï¼: ååããã¸ããã®ã·ã§ã¢è¨å¼µæ»æã«å¯¾ã㦠virtual shares / virtual assets ã§é²å¾¡ãã¦ãããã
æ¤è¨¼ã²ã¼ã: CRITICAL ã¬ãã«ã®ã»ãã¥ãªãã£åé¡ã 0 ä»¶ã§ãããã¨ã
使ç¨ä¾
ä¾ 1: Uniswap V2 å AMM ã®å®è£
ã¦ã¼ã¶ã¼å ¥å: ãã·ã³ãã«ãª AMM ãä½ããããæµåæ§è¿½å ã¨ãã¼ã¯ã³ã¹ã¯ãããã§ããããã«ãã¦ã
ã¢ã¯ã·ã§ã³:
- Step 1: AMM / DEX ã¨å¤å® â
references/amm-patterns.mdã鏿 - Step 2: Constant Product AMM ãã¿ã¼ã³ãèªã¿è¾¼ã¿
- Step 3: 以ä¸ãçæ:
src/ConstantProductAMM.solâ Pair ã³ã³ãã©ã¯ãï¼x * y = kãã¸ãã¯ãnonReentrantãã¹ãªããã¼ã¸ä¿è·ï¼src/interfaces/IAMM.solâ ã¤ã³ã¿ã¼ãã§ã¼ã¹å®ç¾©test/ConstantProductAMM.t.solâ addLiquidity / swap / removeLiquidity ã®ãã¹ã + K å¤ invariant ãã¹ã
- Step 4: ã»ãã¥ãªãã£ç¢ºèª â Reentrancy 鲿¢ãã¹ãªããã¼ã¸ä¿è·ãK 夿¤è¨¼ã確èª
çµæ: ã¹ãªããã¼ã¸ä¿è·ã»Reentrancy 鲿¢ãåãã AMM ã¨ãã¹ãã¹ã¤ã¼ããçæãããã
ä¾ 2: ERC4626 Vault ã®å®è£
ã¦ã¼ã¶ã¼å ¥å: ãERC4626 ã® Vault ãä½ããããETH ã¹ãã¼ãã³ã°ã®å©åããåé ãããã®ã
ã¢ã¯ã·ã§ã³:
- Step 1: Vault ã¨å¤å® â
references/vault-patterns.mdã鏿 - Step 2: ERC4626 æ¨æº + inflation attack é²å¾¡ãã¿ã¼ã³ãèªã¿è¾¼ã¿
- Step 3: 以ä¸ãçæ:
src/StakingVault.solâ OpenZeppelinERC4626ãç¶æ¿ãvirtual shares / virtual assets ã§ inflation attack ãé²å¾¡ãdeposit/withdraw/redeemå®è£test/StakingVault.t.solâ ããã¸ããã»å¼åºã®ãã¹ã + ååããã¸ããæ»æã®é²å¾¡ãã¹ã + share è¨ç®ã® Fuzz ãã¹ã
- Step 4: inflation attack é²å¾¡ã®ç¢ºèªãReentrancy 確èª
çµæ: Inflation attack ã«èæ§ã®ãã ERC4626 Vault ããã¹ãä»ãã§çæãããã
ä¾ 3: Chainlink ãªã©ã¯ã«çµ±å
ã¦ã¼ã¶ã¼å ¥å: ãETH/USD ã®ä¾¡æ ¼ã Chainlink ã§åå¾ãã¦ãUSD 建ã¦ã®è¨ç®ããããã
ã¢ã¯ã·ã§ã³:
- Step 1: ãªã©ã¯ã«ã¨å¤å® â
references/oracle-patterns.mdã鏿 - Step 2: Chainlink Data Feed ãã¿ã¼ã³ãèªã¿è¾¼ã¿
- Step 3: 以ä¸ãçæ:
src/PriceConsumer.solâAggregatorV3Interfaceã使ç¨ãstale price ãã§ãã¯ï¼updatedAt+ é¾å¤ï¼ãnegative price ãã§ãã¯ãdecimals æ£è¦åtest/PriceConsumer.t.solâ ã¢ãã¯ãªã©ã¯ã«ã§ãã¹ããstale price / negative price / decimals 夿ã®ãã¹ã
- Step 4: stale check ã®é¾å¤ï¼heartbeat è¨å®ã«åºã¥ãï¼ããã©ã¼ã«ããã¯ãªã©ã¯ã«ã®æç¡ã確èª
çµæ: Stale / negative price ã«å¯¾ããã¬ã¼ããåãã Chainlink ãªã©ã¯ã«çµ±åãçæãããã
ãã©ãã«ã·ã¥ã¼ãã£ã³ã°
1. K å¤ invariant ãã¹ãã失æãã
çç¶: AMM ã® require(k >= kBefore) ã§ãªãã¼ã
åå ã¨å¯¾ç:
- 丸ã誤差: Solidity ã®æ´æ°é¤ç®ã«ãã丸ãã§ K å¤ãå¾®å°ã«æ¸å°ããã
require(k >= kBefore - 1)ã§è¨±å®¹èª¤å·®ãè¨å®ããããmulDiv颿°ã§ç²¾åº¦ãåä¸ãããã - ææ°æè¨ç®ã®é åº: ææ°æãå·®ãå¼ãã¦ããã¹ã¯ããè¨ç®ãè¡ã£ã¦ããã確èªãããææ°æãèæ ®ãã K 夿¤è¨¼ã«ããã
2. Chainlink ãªã©ã¯ã«ã stale ä¾¡æ ¼ãè¿ã
çç¶: require(updatedAt > block.timestamp - STALE_THRESHOLD) ã§ãªãã¼ã
åå ã¨å¯¾ç:
- heartbeat è¨å®ã®ä¸ä¸è´: Chainlink ã® Data Feed ãã¨ã« heartbeatï¼æ´æ°ééï¼ãç°ãªããETH/USDï¼Mainnetï¼ã¯ 3600 ç§ã対象 feed ã® heartbeat ã確èªãã
STALE_THRESHOLDã heartbeat + ãããã¡ï¼ä¾:3600 + 300ï¼ã«è¨å®ããã - ãã¹ããããã®æå: ãã¹ããããã® Chainlink feed ã¯æ¬çªããæ´æ°ãé ãå ´åãããããã¹ãã§ã¯ã¢ãã¯ãªã©ã¯ã«ã使ç¨ããã
- ãã©ã¼ã«ããã¯: Chainlink ãå¿çããªãå ´åã«åããTWAP çã®ãã©ã¼ã«ããã¯ãªã©ã¯ã«ãè¨å®ããã
3. ERC4626 ã® share è¨ç®ãã¼ãã«ãªã
çç¶: deposit å¾ã« balanceOf(user) ãã¼ã
åå ã¨å¯¾ç:
- Inflation attack: æ»æè
ãæåã« 1 wei ãããã¸ããå¾ã大éã®ãã¼ã¯ã³ãç´æ¥ Vault ã«éä¿¡ã㦠share 価å¤ãè¨å¼µããããOpenZeppelin ã®
ERC4626㯠v5.x ã§ããã©ã«ãã§ virtual shares/assetsï¼ãªãã»ãã = 1ï¼ã使ç¨ãããããææ°çã使ç¨ããã - decimals ã®ä¸ä¸è´: åºç¤ãã¼ã¯ã³ã¨ Vault ã® decimals ãç°ãªãã
decimalsOffset()ã確èªããã
4. swap ãã©ã³ã¶ã¯ã·ã§ã³ãããã³ãã©ã³ããã
çç¶: äºæ³ãããä¸å©ãªã¬ã¼ãã§ã¹ã¯ãããå®è¡ããã
åå ã¨å¯¾ç:
- ã¹ãªããã¼ã¸ä¿è·ã®ä¸è¶³:
minAmountOutãã©ã¡ã¼ã¿ã 0 ã«è¨å®ããã¦ãããããã³ãã¨ã³ãã§é©åãªã¹ãªããã¼ã¸ï¼0.5-1%ï¼ãè¨ç®ãã¦è¨å®ããã - deadline æªè¨å®:
deadlineãã©ã¡ã¼ã¿ã§ãã©ã³ã¶ã¯ã·ã§ã³ã®æå¹æéãè¨å®ãããblock.timestamp + 300ï¼5åï¼ãä¸è¬çã - Private mempool: Flashbots Protect çã®ãã©ã¤ãã¼ã RPC ã使ç¨ãããããªã㯠mempool ã«ãã©ã³ã¶ã¯ã·ã§ã³ãå ¬éããªãã
5. Reentrancy ã«ããè³éæµåº
çç¶: withdraw 颿°ãç¹°ãè¿ãå¼ã³åºãããæ³å®ä»¥ä¸ã®è³éãå¼ãåºããã
åå ã¨å¯¾ç:
- CEI ãã¿ã¼ã³éå: å¤é¨å¼ã³åºãï¼
token.transferï¼ã®åã«ç¶æ ãæ´æ°ï¼æ®é«æ¸ç®ï¼ãã¦ããã確èªãããChecks-Effects-Interactions ã®é åºãå³å®ããã nonReentrantæªä½¿ç¨: å ¨ã¦ã®è³éç§»å颿°ã« OpenZeppelin ã®ReentrancyGuard.nonReentrantãé©ç¨ããã- ã³ã¼ã«ããã¯é¢æ°: ERC777 ã
receive()/fallback()ããã®å帰å¼ã³åºãã«æ³¨æããã
注æäºé
- DeFi ãããã³ã«ã¯æ»æå¯¾è±¡ã«ãªãããããããã»ãã¥ãªãã£ãæåªå ã«ããã
- æ°å¤è¨ç®ã¯ç²¾åº¦ãéè¦ãWADï¼1e18ï¼ãRAYï¼1e27ï¼ãBPSï¼1e4ï¼ãä¸è²«ãã¦ä½¿ç¨ããã
- åºç¤çãªãã¿ã¼ã³ï¼ã¢ã¯ã»ã¹å¶å¾¡ãã¬ã¹æé©åçï¼ã¯
solidity-coreãåç §ããã - ããã³ãã¨ã³ãçµ±åã¯
web3-frontendãåç §ããã - æ¬çªãããã¤åã«å¤é¨ç£æ»ãæ¨å¥¨ããã
- OpenZeppelin ã³ã³ãã©ã¯ãï¼
ERC4626,ReentrancyGuardçï¼ã®å©ç¨ãæ¨å¥¨ããç¬èªå®è£ ã¯é¿ããã