
TCGCトークンの保有量をもとに投票できるDiscord Botです。
事前にウォレットを一度だけ署名で紐づければ、あとはDiscord上のテキストコマンドだけで投票できます。
投票開始(立案)時点でのTCGC保有量をスナップショットとして利用し、重みづけ投票を行います。
途中経過や最終結果まで、すべてDiscord上で確認・操作が可能です。
ウォレット登録(初回のみ)
Discordで「!wallet」を入力すると、BotがDMで認証ページのURLを送ってくれます。
認証ページを開き、ウォレット(例: MetaMask)をConnect → 表示されたnonceを署名。
サーバ側で署名を検証し、ウォレットアドレスとDiscordユーザーIDがひも付きます。
これ以降は、署名不要で投票可能です。
投票の開始(管理者向け)
管理者が「!set <タイトル> <選択肢数> <任意:投票期限(時間)>」を入力。
スナップショット(TCGC残高)を取得し、投票IDが作成されます。
Botがチャットに「投票が始まりました」と告知します。
投票
参加者は「!vote <投票ID> <選択肢番号>」を入力して投票します。
投票力は、投票開始時点(スナップショット)の各ウォレットのTCGC保有量です。
途中経過の確認
「!progress <投票ID>」コマンドで、現時点の各選択肢が集めた投票力を照会できます。
何度でもコマンドを実行してリアルタイム状況を把握できます。
投票終了 & 結果発表
投票期限以降、管理者が「!close <投票ID>」コマンドを実行すると投票は締め切られ、集計結果が自動表示されます。
結果の明細(どのウォレットがどの選択肢へ投票したか)をCSVファイルとして出力・添付する仕組みも用意されています。
Discordだけで完結
投票の作成から締め切り、集計結果の閲覧まですべてコマンド操作。
ユーザーはチャットから移動することなく投票を行えます。
署名は初回だけ
1度ウォレットを紐づけてしまえば、以後の投票で追加の署名は不要。
ウォレットアドレスはデータベースに保存され、コマンドだけで投票できます。
投票力の正当性
投票立案時のTCGC保有量を参照することで、投票中のトークン移動による不正を防止。
DAOにおいては保有割合に応じた重みづけが重要ですが、それを手軽に実現できます。
わかりやすい途中経過 & 集計
「!progress」コマンドでいつでも現状を見られ、投票が活性化。
「!close」で自動集計 → CSV出力すれば、外部にアーカイブや分析することも簡単。
初回署名の負担は最小限に抑えつつ、重みづけ投票の正当性と使いやすさを両立しています。
投票手順は「コマンドを打つだけ」で済み、スナップショットや集計の処理はBotが自動的に行います。
このコードは、ウォレットとDiscordアカウントを紐付けるために署名を行います。あくまでウォレット内で署名をするだけなので、送金やコントラクト実行は行われません。
署名に使用されるのは**nonce(ノンス)**と呼ばれる乱数で、ランダムな文字列になっています。意味不明な文字列が表示されても仕様どおりですのでご安心ください。
メッセージ署名はブロックチェーン上でトランザクションを送るわけではないため、ガス代は一切かかりません。もしウォレット上でガス代が表示された場合、それは送金やコントラクト実行を伴う「本来とは別の操作」が求められている可能性があるため、そのまま署名・承認しないでください。
議題作成時(!setコマンド実行時)にウォレットと紐づけが行われていなかったアカウントは、基本的にその投票で投票力を持ちません。
ただし、Snapshot上で過去半年〜1年以内に投票実績があるウォレットは、投票開始時点のスナップショット取得の段階で投票力の計算に含まれています。
そのため、議題作成後にウォレット紐づけをしても、すでにSnapshot経由で投票履歴があるユーザーであれば、投票参加が可能になります。
大部分のユーザーは、!set後の紐づけでも投票に参加できる運用を想定しています。