DAICOVO詳細解説
DAICOVOは、DAICOというコンセプトを実装した一連のスマートコントラクト群の名称で、投資家のリスク軽減と資金調達者のプロジェクトに対するモチベーションの維持を実現するプロダクトである。ICOVOでは、ICO市場を健全化するため、DAICOVOを使って安心してICOに参加できるプラットフォームを提供している。
DAICOについてはこちらの記事を参照。
DAICOVOはオープンソースであり、誰でも自由に使うことができる。
DAICOVO(https://github.com/icovo/DAICOVO)
DAICOVO構成図
DaicovoStandardToken (Token)
トークンのテンプレート。各プロジェクト用に名前などのパラメータを設定。ERC20準拠かつERC223拡張。ただし、ERC223部分はオリジナルとはインタフェースが少し異なる独自拡張を施している。
TokenController
トークンの発行を管理する。セール開始前は起案者(TokenControllerのOwner)が、セール中はTokenSaleManagerがトークンを発行する権限を持つ。現在はセールが終わると誰も発行できなくなるが、将来的にVotingが拡張されると投票によって発行が可能になる。そのため、セール終了後にVotingによるトークンの発行が可能になるインタフェースを用意している。
TimeLockPool
ETHやトークンを一定期間預かってロックする。指定した期限が過ぎると引き出し可能になる。1つのTimeLockPoolがあらゆる種類のERC20トークンとETHを預かることが可能。
TokenSaleManager
一連のトークンセールを管理するコントラクト。このコントラクトの下に複数のTokenSaleコントラクトが管理される。TokenSaleコントラクトにETHが送られた場合、TokenSaleManagerを通してTokenControllerにトークン発行指示が出される。また、全てのTokenSaleが終了すると、DaicoPoolに対してプロジェクト開始シグナルを送る。セールで集められた資金は全てDaicoPoolに送金される。
TokenSale
トークンセールのテンプレート。プレセール、クラウドセールなど、セールのフェイズ1つにつき1つのTokenSaleが対応する。トークン価格、セール期間、販売トークン数、タイムロックの有無、キャリーオーバー有無などのパラメータを設定可能。
DaicoPool
ICOで集めた資金を格納するプール。各TokenSaleはfinalizeされると集めた資金をこのプールに送金する。プロジェクト開始シグナルを受け取るとTAPがオープンし、起案者による資金の引き出しが可能となる。また、VotingコントラクトからTAP増加、Self Destructionのシグナルを受け取り、対応する処理を行う。
Voting
投票コントラクト。誰でもこのコントラクトに一定のETHを送ることで発議が可能。発議は現在2種類あり、TAP増加またはSelf Destructionについて投票を実施する。一定の投票期間を経て可決された場合、DaicoPoolに該当するシグナルを送る。
DAICOVO運用フロー
—初期のトークン配布まで —
・DaicovoStandardTokenをデプロイする。(トークン名、シンボル、最小単位のパラメータを付与する)
・TokenControllerをデプロイする。(上でデプロイしたトークンアドレスを引数に与える)
・DaicovoStandardToken.transferOwnership(address newOwner)を実行することにより、OwnerをTokenControllerに変更。TokenControllerがトークン発行を管理するようになる。
・TimeLockPoolをデプロイする。
・起案者はToeknControllerを通してトークンを配布する。(クラウドセールで販売せずにチームやマーケティング用に配布する分をこの時点で配布する。
★セール開始以降は起案者による配布はできなくなる。
— トークンセール開始前 —
・DaicoPoolをデプロイする(Token、 初期TAP値、初期資金リリース量のパラメータを設定する)。このとき、DaicoPoolのコンストラクタでVotingが自動デプロイされる。
・TokenSaleManagerをデプロイする(Token, TimeLockPool, DaicoPoolをパラメータとして付与する)。
・TokenSaleManager.addTokenSale(…)でトークンセールを設定する。トークンセールの各種パラメータ(価格や期間、販売数、キャリーオーバーの有無など)を与える。
・必要なセールを全て設定し終わったら、TokenSaleManagerのInitialize()を実行。(トークンセールの設定がFixされる)
・TokenControllerのOpenTokenSale(TokenSaleManagerがパラメータ)を実行。以降、起案者はトークン配布ができなくなる。
★セール前の配布状況は誰でも確認できるので、投資家はホワイトペーパーに記載された配布比率を守っているか確認した上でこの後のセールに参加できる。
・起案者がTokenSaleManager.addToWhitelist(もしくはaddManyToWhitelist)を実行し、KYC済みのユーザのアドレスをホワイトリスト登録。登録されたユーザのみがセールに参加できる。(Whitelistは以降随時追加可能)
★トークンセール以降は全てtrustlessで進むように設計されており、起案者でも内容を変更したり、運用を中断させたりすることはできない。その後の進行が誰にとっても明確な状態でセールが開始する。
— トークンセール中 —
・1番目のTokenSaleに設定した開始時刻を過ぎるとセールがオープンする。
・Whitelistに登録された購入希望者は、TokenSaleコントラクトにETHを送金することで、金額に応じたTokenを受け取る。なお、TokenSaleには最低購入価格が設定されており、これを下回る場合はトランザクションが失敗する。
・セールが時間経過によって終了した場合、もしくは設定されたトークンが全て売り切れた場合、TokenSaleManager.finalize(uint256 index)でTokenSaleをfinalizeすることが可能。finalize操作は誰でも行うことができる。
★このfinalize処理によって集められた資金はDaicoPoolに送られる。(なんらかの理由でTokenSaleに資金が取り残された場合に備え、finalizeは何度でも実行できるようになっている。)。また、finalizeと同時に次のTokenSaleがInitializeされる。TokenSaleのcarryoverがtrueに設定されている場合はキャリーオーバーの処理が行われ、売れ残ったトークンが次のTokenSaleに引き継がれる。
・全てのTokenSaleがfinalizeされるとTokenSaleManager.finalizeTokenSaleManager()を実行できる。この操作も誰でも行うことができる。TokenSaleManagerのfinalizeによってDaicoPoolのTAPがオープンし、設定された初期資金のリリースと、TAP値に従った資金リリースが開始される。同時に、投票の発議が可能になる。
— プロジェクト進行中 —
・DaicoPoolがスタートされたあとは、起案者はDaicoPoolからリリースされた資金を引き出すことができる。
・また、誰でも投票の発議を行うことができる。発議が行われると、投票フェイズに移行する。
— 投票中 —
★投票実施中もDaicoPoolの挙動は変わらない。
・トークン保有者は、一定のETHを支払うことでTAP増加(Voting.addRaiseTapProposal(…))もしくはSelf Destruction (Voting.addDestructionProposal(...))の発議を行うことができる。
・発議が行われると、即座に14日間の投票が開始される。トークン保有者はトークンをVotingコントラクトに送ることで賛成/反対の投票を行うことができる(Voting.vote(bool agree, uint256 amount))。
・投票期間が終了すると、誰でもVotingのfinalizeを行うことができる。このとき、可決条件を満たしていればDaicoPoolにRaiseTapもしくはSelfDescructionのシグナルを送る。可決条件を満たしていなければ何も起こらない。
・finalizeが行われると、投票時に預けたトークンの引き出しが可能になる。Votingに対してreturnToken()を実行することでトークンの返却を受けられる。誰でもこのreturnToken()を実行可能で、実行者に関係なく、元の保有者にトークンが返却される。
★ICOVOではこのトークン返却を自動的にトリガーするスクリプトを組み、投票者が自分でトークンを取りに来なくてもウォレットに返却されるようにする予定。
— Self Destruction可決後 —
・投票によりSelf Destructionが可決された場合、DaicoPoolは即座に30日分の資金を起案者にリリースし、TAPを閉じる。この30日分の資金はプロジェクトの手仕舞いにかかる費用を精算するためのものである。TAPが閉じると同時に、トークン保有者は資金の返却を受けることが可能になる。
・DaicoPool.refund(…)を実行することにより、トークンと引き換えにDaicoPoolに残った資金を受け取る。受け取る資金は、DaicoPoolに残った資金 ✕(引き換えたトークン量 / トークン総発行量)となる。