pNouns⚡️snapshot投票の自動化

2023/02/14に公開

pNounsでは純度の高いDAOを目指してNounsLilNounsで使われているシステムをpNouns仕様にカスタマイズしようとしています。
ここ数週間、両者のソースコードを解読してきましたが、見れば見るほど精細に作り込まれていることがわかり、これをpNouns仕様にカスタマイズするのは難易度が高く、私レベルでは数ヶ月でできる気がしません😭

その間、snapshot.orgによる投票を継続することになりますが、週に何本もプロポーザルが起票されている中、今の運用だと担当者の負担が高く、これがずっと続くのは大変です。
( みきさっくさん、aratamaさん、まきさん、いつもありがとうございます)

そこで、まずは以下のイメージのように最低限の機能でNounsプロポーザルの取り込みと投票を自動化していくことにしようと思いました。

概要

大きく、以下の3つの機能です。

  • Nounsで起票されたプロポーザルを取り込んでpNounsのsnapshot.orgへ登録する機能
  • snapshot.orgの投票結果を集計してNounsへ投票する機能
  • 投票で育てるSBT

投票で育てるSBTはまだまだ構想段階で具体化していません。
以下、それぞれの機能を説明します。

⚡️Nounsプロポーザルのインポート

Nounsで起票されたプロポーザルを取り込んでpNounsのsnapshot.orgへ登録する機能です。(オレンジ矢印)

  1. Nounsプロポーザルの取得
  • NounsではGraphQLという仕組みでプロポーザル情報を公開していることがわかったため、これを使ってNounsで起票されたプロポーザルを取り込む。
  • ただし単純に取り込むと、取得したプロポーザルのうち、どれがインポート済みでどれが未インポートなのかわからない。
  • このため、snapshot.orgからもpNounsが登録したプロポーザルの一覧を取り込んで、Nounsから取得したプロポーザルのうち、インポートすべきなのはどれなのかを特定する(snapshot.orgもプロポーザルをGraphQLで公開している)
  1. snapshot.orgへの登録
  • snapshotへの登録は、snapshot.jsというjavascriptライブラリが公開されていたため、これを用いる。
  • 投票期間などもこのタイミングで計算して設定する
  1. AI解析
  • プロポーザルの内容をGPT3で解析する。調査はこれからだが、いくつかAPIが公開されているようなのでどれか適当なのを用いる。
  • GPTは先に英語で解析させた方が精度が高いと聞くので、一旦英語のまま要約を作った後で和訳する。
  • あと、NounsHolderならどのように考えるかをAIで推測させられれば面白そう。
  1. discordフォーラムへの登録
  • AI解析したプロポーザル内容は、snapshotのリンクとともに、discordフォーラムへ投稿する。
  • プロポーザルごとにフォーラムを設定する他、その日に投票期間中の投票を一覧で投稿する機能もあれば良さそう。追々と機能拡充していく。

⚡️Nounsへの投票

snapshot.orgの投票結果を集計してNounsへ投票する機能です。(青色矢印)

  1. 投票対象プロポーザルの特定
  • NounsのGraphQLで、投票期間中のプロポーザルを取得し、この中に投票履歴が含まれているので、pNounsのアドレスから投票されているかをチェックする。
  • ここでpNounsのアドレスが含まれていない投票のうち、snapshot投票が終わっているものが投票対象プロポーザルとなる。
  1. snapshot結果の取得
  • snapshotのGraphQLから、1で特定したプロポーザルの投票結果を取得する。
  • そのプロポーザルのsnapshot上の投票期間が終わっていない場合はスキップ。
  • 投票結果から、賛成/反対/棄権のいずれに投票するかを判定する。
  1. Nounsへの投票
  • Nounsへの投票は、ethers.jsというブロックチェーンにアクセスできるjavascriptライブラリを用いる。
  • 投票するためには、NounsNFTを所有するかデリゲートされていないといけないが、ツール用のアドレスにNounsNFTを所有させるのはリスクが高いため、デリゲートしておく。
  • Nounsへの投票は、従来より使用されていたcastVote関数と、ガス代が返還されるcastRefundableVote関数の2種類存在する。当然castRefundableVote関数を使えればこちらを使用する。
  • ガス代は、ETHで支払うが返還されるのはWETHのため(要確認)、ツール用のアドレスにある程度のETHをプールさせておく必要がある。
  1. discordへの投稿
    投票結果は、discordにも投稿する。

⚡️投票で育てるSBT

以前、discordへアイデアを投稿し、ちゃのはさんにデザインしてもらったもの。

ポイント設計など、構想を練っていく。

最後に

今回は開発用のメモのつもりで、箇条書きでバーッと書いたため、ちょっと文章多めになっちゃいました。
もし興味持っていただけた方いらっしゃれば、pNouns Discordの開発部屋にいますので、コメントください。

Discussion