solidity-governance
npx skills add https://github.com/stanah/dotagents --skill solidity-governance
Agent 安装分布
Skill 文档
solidity-governance: DAOã»ã¬ããã³ã¹éçºã¹ãã«
DAO ã¬ããã³ã¹ã«ãããæç¥¨ãææ¡ãã¿ã¤ã ããã¯ããã¬ã¸ã£ãªã¼ç®¡çã®ãã¿ã¼ã³ãæä¾ãããã¡ã¤ã³ç¹åã¹ãã«ã
対象
- OpenZeppelin Governor ãã¼ã¹ã®ã¬ããã³ã¹
- æç¥¨ã¡ã«ããºã ï¼ãã¼ã¯ã³å éã»Quadratic Votingã»veTokenï¼
- ã¿ã¤ã ããã¯ã»é å»¶å®è¡
- ãã¬ã¸ã£ãªã¼ç®¡çã»ãã«ãã·ã°
ã¯ã¼ã¯ããã¼
Step 1: ã¬ããã³ã¹è¦ä»¶ã®æ´ç
ã¦ã¼ã¶ã¼ã®è¦ä»¶ããã¬ããã³ã¹ã®æ§æè¦ç´ ãå¤å®ãã:
| ã¦ã¼ã¹ã±ã¼ã¹ | ãªãã¡ã¬ã³ã¹ | èªã¿è¾¼ã¿æã®æ³¨ç®ãã¤ã³ã |
|---|---|---|
| DAO æ§ç¯ã»æç¥¨ã·ã¹ãã | references/dao-patterns.md |
Governor è¨è¨ãæç¥¨ã¡ã«ããºã é¸æãææ¡ã©ã¤ããµã¤ã¯ã« |
| ãã¬ã¸ã£ãªã¼ã»è³é管ç | references/treasury-patterns.md |
ãã«ãã·ã°ãäºç®å¶éãæ¯åºæ¿èªããã¼ |
| é å»¶å®è¡ã»å®å ¨è£ ç½® | references/timelock-patterns.md |
TimelockControllerãç·æ¥åæ¢ãã¬ã¼ãã£ã¢ã³ |
è¤æ°ã®ã³ã³ãã¼ãã³ããé¢é£ããå ´åï¼Governor + Timelock ãä¸è¬çï¼ã¯å ¨ã¦ã®ãªãã¡ã¬ã³ã¹ãèªã¿è¾¼ãã
æ¤è¨¼ã²ã¼ã: ã¬ããã³ã¹ã®åºæ¬è¦ä»¶ï¼æç¥¨æ¹å¼ã»ãã¼ã¯ã³ç¨®å¥ã»æææ±ºå®ã¹ã³ã¼ãï¼ãæç¢ºã§ãããã¨ã䏿ãªå ´å㯠AskUserQuestion ã§ç¢ºèªããã
Step 2: ã¬ããã³ã¹ãã¼ã¯ã³ã®æ±ºå®
| æ¹å¼ | æ¨å¥¨å®è£ | ã¦ã¼ã¹ã±ã¼ã¹ |
|---|---|---|
| ERC20 ãã¼ã¹ | ERC20Votesï¼æç¥¨æ¨©å§ä»»å¯¾å¿ï¼ |
ä¸è¬ç㪠DAOããã¼ã¯ã³ä¿æéã«æ¯ä¾ããæç¥¨æ¨© |
| NFT ãã¼ã¹ | ERC721Votesï¼1 NFT = 1ç¥¨ï¼ |
ã¡ã³ãã¼ã·ããå DAOã1人1票ã®å¹³çãªæç¥¨ |
| æ¢åãã¼ã¯ã³æ´»ç¨ | ERC20Wrapper + ERC20Votes |
æ¢åã® ERC20 ãã¼ã¯ã³ã«æç¥¨æ©è½ã追å |
| ããã¯å | veToken ãã¿ã¼ã³ï¼èªåå®è£ ï¼ | é·æä¿æãåªéãããã¯æéã«å¿ãã¦æç¥¨æ¨©å¢å |
夿ã䏿ãªå ´å: AskUserQuestion ã§ãæ¢åãã¼ã¯ã³ã®æç¡ããæç¥¨æ¨©ã®å¹³çæ§ããããã¯ã¤ã³ã»ã³ãã£ãã®è¦å¦ãã確èªããã
æ¤è¨¼ã²ã¼ã: ã¬ããã³ã¹ãã¼ã¯ã³ã®æ¹å¼ã決å®ããOpenZeppelin ã®å¯¾å¿ã©ã¤ãã©ãªãå©ç¨å¯è½ã§ãããã¨ã
Step 3: Governor ãã©ã¡ã¼ã¿è¨è¨
ããã¸ã§ã¯ãã®è¦æ¨¡ã»æ§è³ªã«å¿ãã¦ãã©ã¡ã¼ã¿ãè¨è¨ãã:
| ãã©ã¡ã¼ã¿ | å°è¦æ¨¡ DAOï¼<100äººï¼ | ä¸è¦æ¨¡ DAOï¼100-1000äººï¼ | å¤§è¦æ¨¡ DAOï¼1000+äººï¼ |
|---|---|---|---|
| Voting Delay | 1 day (7200 blocks) | 2 days | 3 days |
| Voting Period | 3-5 days | 7 days | 14 days |
| Proposal Threshold | 0.1-1% of supply | 0.5-2% | 1-5% |
| Quorum | 2-5% | 4-10% | 10-20% |
| Timelock Delay | 1-2 days | 2-3 days | 3-7 days |
è¨è¨ã®èæ ®äºé :
- Voting Delay: ãã©ãã·ã¥ãã¼ã³æç¥¨æ»æã®é²æ¢ãã¹ãããã·ã§ããã¯ææ¡ä½ææã®ãããã¯ã§åå¾ããããããDelay æéä¸ã®ãã¼ã¯ã³è³¼å ¥ã¯æç¥¨ã«åæ ãããªãã
- Proposal Threshold: ã¹ãã ææ¡ã®é²æ¢ãä½ãããã¨æ»æã³ã¹ãä½ä¸ãé«ãããã¨å°æ°æ´¾ã®ææ¡ãå°é£ã
- Quorum: æç¥¨ã®æ£å½æ§ç¢ºä¿ãä½ãããã¨å°æ°æ´¾ã«ããæ¯é ãé«ãããã¨å¯æ±ºãå°é£ã
- Timelock Delay: ä¸å©ãªææ¡ãå®è¡ãããåã«ã¦ã¼ã¶ã¼ãéåºï¼exitï¼ããæéã確ä¿ã
æ¤è¨¼ã²ã¼ã: å ¨ãã©ã¡ã¼ã¿ãè¨å®ãããçç¾ããªããã¨ï¼ä¾: Voting Delay < Voting Periodï¼ã
Step 4: ã³ã¼ãçæ
solidity-coreã®language-patterns.mdã«å¾ã NatSpecã»ã³ã¼ãã£ã³ã°è¦ç´ãé©ç¨ããã- ã¬ããã³ã¹åºæã®ã³ã³ãã¼ãã³ããçæãã:
- Governor ã³ã³ãã©ã¯ã: OpenZeppelin ã® Governor + å¿ è¦ãªæ¡å¼µãç¶æ¿
- ã¬ããã³ã¹ãã¼ã¯ã³:
ERC20Votesã¾ãã¯ERC721Votes - TimelockController: Governor ã® executor ã¨ãã¦è¨å®
- ãããã¤ã¹ã¯ãªãã: æ£ãããããã¤é åºï¼Token â Timelock â Governor â Role è¨å®ï¼
- ãã¹ãã³ã¼ããåæã«çæãã:
- ææ¡ â æç¥¨ â ãã¥ã¼ â å®è¡ã®å®å ¨ããã¼
- Quorum æªéãã¹ã
- Proposal Threshold æªéãã¹ã
- ã¿ã¤ã ããã¯é å»¶ãã¹ã
æ¤è¨¼ã²ã¼ã: forge build ãã¨ã©ã¼ãªãå®äºããææ¡âæç¥¨âå®è¡ã®ããã¼ãã¹ãããã¹ãããã¨ã
Step 5: ã»ãã¥ãªãã£ç¢ºèª
ã¬ããã³ã¹ç¹æã®ã»ãã¥ãªãã£ãªã¹ã¯ã確èªãã:
- ãã©ãã·ã¥ãã¼ã³æç¥¨:
ERC20Votesã®ã¹ãããã·ã§ããæç¥¨ãæå¹ããææ¡æç¹ã®getPastVotesã使ç¨ãã¦ãããã - ã¬ããã³ã¹ä¹ã£åã: Proposal Threshold 㨠Quorum ãæ»æã³ã¹ãã«å¯¾ãã¦ååãã
- ææ¡ã¹ãã : Proposal Threshold ãè¨å®ããã¦ãããã
- å®è¡æä½ã®ãªã¹ã¯: Timelock ã®é å»¶æéãååããç·æ¥åæ¢ã®ã¬ã¼ãã£ã¢ã³ãè¨å®ããã¦ãããã
- æç¥¨æ¨©ã®éä¸: 大å£ä¿æè ã Quorum ãåç¬ã§æºãããªãã確èªã
æ¤è¨¼ã²ã¼ã: CRITICAL ã¬ãã«ã®ã»ãã¥ãªãã£åé¡ã 0 ä»¶ã§ãããã¨ã
使ç¨ä¾
ä¾ 1: OpenZeppelin Governor ãã¼ã¹ã® DAO
ã¦ã¼ã¶ã¼å ¥å: ããã¼ã¯ã³ä¿æè ãææ¡ã»æç¥¨ã§ãã DAO ãä½ããããã¿ã¤ã ããã¯ä»ãã§ã
ã¢ã¯ã·ã§ã³:
- Step 1: DAO æ§ç¯ + ã¿ã¤ã ãã㯠â
dao-patterns.md+timelock-patterns.mdãèªã¿è¾¼ã¿ - Step 2: ERC20 ãã¼ã¹ â
ERC20Votesã鏿 - Step 3: ä¸è¦æ¨¡ DAO ã®ãã©ã¡ã¼ã¿ãé©ç¨ï¼Voting Delay: 2æ¥ãPeriod: 7æ¥ãQuorum: 4%ï¼
- Step 4: 以ä¸ãçæ:
src/GovernanceToken.solâERC20Votes+ERC20Permitç¶æ¿ããã³ã颿°ä»ãsrc/MyGovernor.solâGovernor+GovernorSettings+GovernorCountingSimple+GovernorVotes+GovernorVotesQuorumFraction+GovernorTimelockControlç¶æ¿src/MyTimelock.solâTimelockControllerã©ããã¼test/Governance.t.solâ ææ¡âæç¥¨âãã¥ã¼âå®è¡ã®ãã«ããã¼ãQuorum æªéãæéåããã¹ãscript/DeployGovernance.s.solâ Token â Timelock â Governor ã®é åºã§ãããã¤ãTimelock ã« Governor ã proposer / executor ã¨ãã¦è¨å®
- Step 5: ãã©ãã·ã¥ãã¼ã³é²å¾¡ï¼ã¹ãããã·ã§ããæç¥¨ï¼ãã¿ã¤ã ããã¯é å»¶ã®ç¢ºèª
çµæ: å®å ¨ãªã¬ããã³ã¹ã·ã¹ãã ï¼ãã¼ã¯ã³ + Governor + Timelockï¼ããã¹ãã»ã¹ã¯ãªããä»ãã§çæãããã
ä¾ 2: NFT ãã¼ã¹ã® 1人1票 DAO
ã¦ã¼ã¶ã¼å ¥å: ãã¡ã³ãã¼ã·ãã NFT ãæã£ã¦ãã人ãæç¥¨ã§ãã DAOã1人1票ã«ãããã
ã¢ã¯ã·ã§ã³:
- Step 1: DAO æ§ç¯ â
dao-patterns.mdãèªã¿è¾¼ã¿ â NFT æç¥¨ãã¿ã¼ã³ã鏿 - Step 2: NFT ãã¼ã¹ â
ERC721Votesã鏿ï¼solidity-nftã®ãã¼ã¯ã³æ¨æºãåç §ï¼ - Step 3: å°è¦æ¨¡ DAO ãã©ã¡ã¼ã¿ï¼Voting Delay: 1æ¥ãPeriod: 5æ¥ãQuorum: 5%ï¼
- Step 4: 以ä¸ãçæ:
src/MembershipNFT.solâERC721Votesç¶æ¿ãæå¾ å¶ãã³ãï¼owner ã®ã¿ï¼src/NFTGovernor.solâ NFT ãã¼ã¹ Governortest/NFTGovernance.t.solâ NFT ä¿æè ã®æç¥¨ãã¹ããéä¿æè ã®æç¥¨æå¦ãã¹ã
- Step 5: 1人ãè¤æ° NFT ãä¿æããå ´åã®æç¥¨æ¨©ç¢ºèªï¼NFT æ° = æç¥¨æ¨©æ°ï¼
çµæ: ã¡ã³ãã¼ã·ãã NFT ã«ããæç¥¨ã·ã¹ãã ãçæãããã
ä¾ 3: ãã«ãã·ã° + Governor ãã¤ããªãã
ã¦ã¼ã¶ã¼å ¥å: ãåæã¯å°äººæ°ã®ãã«ãã·ã°ã§éå¶ãã¦ãå°æ¥çã«ãã«ãªã³ãã§ã¼ã³ã¬ããã³ã¹ã«ç§»è¡ãããã
ã¢ã¯ã·ã§ã³:
- Step 1: ãã¬ã¸ã£ãªã¼ + DAO â
treasury-patterns.md+dao-patterns.mdãèªã¿è¾¼ã¿ - Step 2: åæã¯æ¢åãã¼ã¯ã³ãªã â ã¾ããã«ãã·ã°ãå¾ã§ ERC20Votes ãå°å ¥
- Step 3: 段éçç§»è¡ãã©ã¡ã¼ã¿è¨è¨
- Step 4: 以ä¸ãçæ:
- Phase 1:
src/Treasury.solâTimelockControllerãã¼ã¹ã3/5 ãã«ãã·ã°ã proposer / executor ã«è¨å® - Phase 2ï¼ç§»è¡ç¨ï¼:
src/GovernanceToken.sol+src/MyGovernor.solâ Governor ã Timelock ã® proposer ã«è¿½å ãããã«ãã·ã°ã段éçã« executor ããåé¤ test/Migration.t.solâ Phase 1 â Phase 2 ã®ç§»è¡ãã¹ã
- Phase 1:
- Step 5: ç§»è¡ä¸ã®ã»ãã¥ãªãã£ï¼ãã«ãã·ã°ã¨ Governor ãåæã«æ¨©éãæã¤æéã®ç®¡çï¼
çµæ: 段éçã«ãªã³ãã§ã¼ã³ã¬ããã³ã¹ã¸ç§»è¡å¯è½ãªãã¤ããªããã·ã¹ãã ãçæãããã
ãã©ãã«ã·ã¥ã¼ãã£ã³ã°
1. ææ¡ãå®è¡ã§ããªãï¼ã¿ã¤ã ããã¯ã¨ã©ã¼ï¼
çç¶: æç¥¨æåå¾ãqueue ã¾ã㯠execute ã AccessControl: account is missing role ã§ãªãã¼ã
åå ã¨å¯¾ç:
- Governor ã« Timelock ã® role ãè¨å®ããã¦ããªã: ãããã¤å¾ã«
TimelockController.grantRole(PROPOSER_ROLE, governorAddress)ã¨grantRole(EXECUTOR_ROLE, governorAddress)ãå®è¡ããå¿ è¦ãããããããã¤ã¹ã¯ãªããã«å«ãããã¨ã - Timelock ã® delay ãçµéãã¦ããªã:
queueå¾ãexecuteã«ã¯ Timelock ã®minDelay以ä¸ã®æéçµéãå¿ è¦ããã¹ãã§ã¯vm.warp(block.timestamp + minDelay + 1)ã§ã¹ãããããã
2. Quorum ãéæã§ããªã
çç¶: ååãªç¥¨æ°ãããã®ã«ææ¡ã Defeated ã«ãªã
åå ã¨å¯¾ç:
- æç¥¨æ¨©ã®å§ä»»å¿ã:
ERC20Votesã¯ããã©ã«ãã§æç¥¨æ¨©ã 0ããã¼ã¯ã³ä¿æè ã¯delegate(èªåã®ã¢ãã¬ã¹)ãå¼ã¶å¿ è¦ããããããã³ãã¨ã³ãã§èªåå§ä»»ãå®è£ ãããã_afterTokenTransferã§èªåå§ä»»ããã - ã¹ãããã·ã§ããã®ã¿ã¤ãã³ã°: æç¥¨æ¨©ã¯ææ¡ä½ææã®ãããã¯ã§ç¢ºå®ãããææ¡ä½æå¾ã«ãã¼ã¯ã³ãåå¾ãã¦ãæç¥¨æ¨©ã«åæ ãããªãã
- Quorum è¨ç®ã®å¯¾è±¡:
GovernorVotesQuorumFractionã¯token.getPastTotalSupply()ã«å¯¾ãããã¼ã»ã³ãã¼ã¸ããã¼ã¯ã³ç·ä¾çµ¦éã大ãããã㨠Quorum éæãå°é£ã
3. ææ¡ã®ä½æãã§ããªã
çç¶: propose ã GovernorInsufficientProposerVotes ã§ãªãã¼ã
åå ã¨å¯¾ç:
- Proposal Threshold æªé: ææ¡è
ã®æç¥¨æ¨©ã
proposalThreshold()æªæºãæç¥¨æ¨©ãå§ä»»æ¸ã¿ã確èªããã - æç¥¨æ¨©ã®å§ä»»ã¿ã¤ãã³ã°:
delegateã®ã¿ã¤ãã³ã°ãææ¡ä½æã¨åä¸ãããã¯å ã ã¨åæ ãããªããå°ãªãã¨ã 1 ãããã¯åã«å§ä»»ããã
4. æç¥¨çµæãåæ ãããªã
çç¶: castVote ãæåããããæç¥¨çµæã«åæ ãããªã
åå ã¨å¯¾ç:
- æç¥¨æéå¤:
state()ãActiveã§ãªãæéã«æç¥¨ãã¦ãããvotingDelayçµéå¾ãvotingPeriodå ã«æç¥¨ããããã¹ãã§ã¯vm.roll(block.number + votingDelay + 1)ã§ã¹ãããã - éè¤æç¥¨: åä¸ã¢ãã¬ã¹ããã® 2 åç®ã®æç¥¨ã¯ç¡è¦ãããï¼ã¨ã©ã¼ã«ãªããªãå ´åãããï¼ã
hasVotedã§ç¢ºèªããã
5. ãããã¤é åºã®åé¡
çç¶: Governor / Timelock ã®åç §ãã¼ãã¢ãã¬ã¹ã«ãªã
åå ã¨å¯¾ç:
- 循ç°ä¾å: Governor 㯠Timelock ããTimelock 㯠Governor ãåç §ãããæ£ãããããã¤é åº: (1) Token â (2) Timelockï¼Governor = address(0) ã§ä»®è¨å®ï¼â (3) Governorï¼Timelock åç §ï¼â (4) Timelock ã« Governor ã® role ãä»ä¸ã
- Deployer ã® admin role: ãããã¤å¾ãdeployer ã Timelock ã®
DEFAULT_ADMIN_ROLEãæ¾æ£ï¼renounceRoleï¼ãããã¨ãå¿ããªããæ¾æ£ããªãã¨ãããã¤ã¤ã¼ãå ¨æ¨©ãæã¡ç¶ããã
注æäºé
- ã¬ããã³ã¹æ»æï¼ãã©ãã·ã¥ãã¼ã³æç¥¨ï¼ã¸ã®é²å¾¡ã¨ãã¦ã¹ãããã·ã§ããæç¥¨ï¼
ERC20Votesï¼ã使ç¨ããã - ã¿ã¤ã ããã¯ã¯ææ¡å®è¡åã®ç£è¦æéã¨ãã¦ä¸å¯æ¬ ãæä½ 1 æ¥ä»¥ä¸ãæ¨å¥¨ã
- åææ®µéã§ã¯ãã«ãã·ã° + ã¬ããã³ã¹ã®ä½µç¨ãæ¨å¥¨ããããã«ãªã³ãã§ã¼ã³ã¬ããã³ã¹ã¯ååã«ã³ãã¥ããã£ãæçãã¦ããç§»è¡ããã
- æç¥¨æ¨©ã®èªåå§ä»»ï¼
_afterTokenTransferå ã§_delegateï¼ãæ¤è¨ãããå§ä»»å¿ãã¯æãä¸è¬ç㪠UX åé¡ã - åºç¤çãªãã¿ã¼ã³ï¼ã¢ã¯ã»ã¹å¶å¾¡ãã¬ã¹æé©åçï¼ã¯
solidity-coreãåç §ããã - ããã³ãã¨ã³ãçµ±åï¼ææ¡ UIãæç¥¨ UIï¼ã¯
web3-frontendãåç §ããã - OpenZeppelin Governor ã®å©ç¨ãæ¨å¥¨ããã«ã¹ã¿ã ã¬ããã³ã¹ã®ç¬èªå®è£ ã¯é¿ããã