概要

アプリケーションがWeb2とWeb3の両方で動作することを実現するため、抽象化レイヤーを用意する。デザインパターンのStrategyパターンを参考にして作成する。

概念設計

アプリケーション側でそのDAOがWeb2なのかWeb3なのかフラグを持っておく。

Hookのインターフェイスを定義し、Web2実装とWeb3実装を行う。

フラグに応じて、どちらのHookを使用するのか選択を行い、Web2側のメソッドを呼び出すか、Web3側のメソッドを呼び出すか分ける。

type usePollInterface = (daoId: string) => {
  vote: (points:number[]) => void,
  contributors: User[]
}

const usePollWeb3: usePollInterface = (daoId: string) => {
  //実装
}

const usePollWeb2: usePollInterface = (daoId: string) => {
  //実装
}

const usePoll: usePollInterface = (daoId: number) => {
  // strategy選択の実装を最初に行う
  vote: selectedStrategy.vote,
  contributors: selectedStrategy.contributors,
}

PoC

usePollを例にしてPoCを実装した

https://github.com/teichaku-org/teichaku/pull/5/files

トークン配布について

前提

不正なトークン詐取ができないように、ユーザIDとウォレットアドレスの紐付けはサーバサイドで実施する必要がある。

スマートコントラクトの実行はサーバサイドで実施する必要があるが、技術的に負荷が大きいため今回は実装しない。