トレジャリーと投票コントラクトをつくろう
📝 ガバナンスコントラクトをデプロイする
DAOの運営のために使われるガバナンストークンは素晴らしいものですが、それを使って運営できなければ意味がありません。
次に行うのは、ガバナンストークンを用いて提案・投票できるコントラクトを作成することです。
ここで作成するコントラクトは、DAOメンバーによる提案に対して投票を行い、その票を自動的に集計します。
すべてのDAOメンバーがこれらをすべてオンチェーンで実行できるようにします。
例えば、「ランディングページのデザインを作成してもらうために、Aさんに1000トークンを譲渡する」というような提案を作成するとします。
- 投票は誰ができるのでしょうか?
- 投票に必要な時間はどれくらいなのでしょうか?
- 提案するために必要なトークンの最低数はどれくらいでしょうか?
これらの疑問はすべて、最初に作成するガバナンスコントラクトで解決されます。
まるで小さな国を立ち上げるようなもので、最初の政府と投票システムを設定する必要があるのです。
ただし、ガバナンスはあまり複雑にしないほうが一般的には良いとされています。
それでは早速、src/scripts/8-deploy-vote.tsを作成し、以下のコードを追加しましょう。
import sdk from "./1-initialize-sdk";
import { ERCTokenAddress } from "./module";
(async () => {
try {
const voteContractAddress = await sdk.deployer.deployVote({
// ガバナンス用のコントラクトに名前を付けます
name: "My amazing DAO",
// ERC-20 トークンのコントラクトアドレスを設定します
voting_token_address: ERCTokenAddress,
// 以下の 2 つのパラメータはブロックチェーンのブロック数を指定します(Ethereum の場合、ブロックタイムを 13-14 秒と仮定)
// 提案が作成された後、メンバーがすぐに投票できるよう 0 ブロックを設定する
voting_delay_in_blocks: 0,
// 提案が作成された後、メンバーが投票できる期間を 1 日(6570 ブロック)に設定する
voting_period_in_blocks: 6570,
// 提案の投票期間が終了した後、提案が有効となるために投票する必要があるトークンの総供給数の最小値を 0% に設定する
voting_quorum_fraction: 0,
// ユーザーが提案するために必要なトークンの最小値を 0 に設定する
proposal_token_threshold: 0,
});
console.log(
"✅ Successfully deployed vote contract, address:",
voteContractAddress
);
} catch (err) {
console.error("Failed to deploy vote contract", err);
}
})();
コントラクトをセットアップするためにdeployer.deployVoteを使用しています。
これは全く新しい投票用コントラクトをデプロイします。
voting_token_addressを設定していることに注目してください。
ここでは、どのトークンをガバナンストークンとして設定するかをコントラクトに示しています。
voting_delay_in_blocksでは、メンバーが投票できるようになるまでの期間を設定しています。
メンバーが投票できるようになる前に、提案について検討する時間を与えたい場合に便利です。
同様に、voting_period_in_blocksもあります。
これは、提案が有効になってから投票できる期間をブロック単位で指定しています。
voting_quorum_fraction