DAICOオープンソースフレームワーク #02 DAICOVOのデプロイと運用フロー

DAICOオープンソースフレームワーク #02 DAICOVOのデプロイと運用フロー

第2回では、DAICOVOのデプロイと運用のフローについて説明する。コードを改変せず、単にDAICOVOを使用する場合、こちらのフローに沿って作業をすれば動作させることが可能だ。

 

ICOの準備段階(プライベートセールやトークンの配布)から、クラウドセールの実施、プロジェクト開始以降の資金管理(投票を含む)、返金が可決された場合までを含め、順を追って解説する。

セール前のトークン配布まで

DaicovoStandardTokenをデプロイする

 

DaicovoStandardTokenを使わず、オリジナルのERC20トークンを用いても良い。その場合、Mintable, Ownableを継承している必要がある。

WhitepaperVersioningにホワイトペーパーを登録する(optional)

この手順はオプションのため、DAICOVOを試すだけなら不要だ。ICOVOプラットフォームでICOを行う場合、WhitepaperVersioningを設定してホワイトペーパーを管理することが必須である。これは、Whitepaperの改ざんをできなくするためだ。

 

 

WhitepaperVersioningはグローバルに1つのインスタンスを持っている。そのインスタンス上に自プロジェクトのホワイトペーパーを登録する。ホワイトペーパーはIPFS上に登録しておき、そのハッシュ値をWhitepaperVersioningに順次登録することで、変更履歴を辿れるようにする(つまり、改ざんしてもバレてしまう状態にする)。ホワイトペーパーのバージョンが上がる度にpushWhitepaper()を実行する。

 

_contractはOwnableである必要があり、ownerのみが1度目の登録を行うことができる。2回目以降は最初に登録を行ったアドレスから登録可能である。これはつまり、_contractのownerが後から変更になったとしても、最初の登録を行った者が更新の権限を持ち続けるということだ。

TokenControllerをデプロイする

トークンのownerを変更する

 

発行するトークンのtransferOwnership()を実行することにより、OwnerをTokenControllerに変更する。ownerが変わるため、前のWhitepaperVersioningはこの手順の前に行う必要がある。変更後、TokenControllerがトークン発行を管理するようになる。

TokenControllerを通してトークンを配布する

クラウドセールで販売せずにチームやマーケティング用に配布する分をこの時点で配布する。また、クローズドセールで販売するトークンがあれば、それもこの段階で配布する。なお、セール開始以降は起案者による配布はできなくなる。

 

 

また、一定期間ロックアップするトークンがあれば、TimeLockPoolにデポジットする。

TimeLockPoolにデポジットする前に、トークンコントラクトのapprove()で、TimeLockPoolにトークンの引き出し権限を付与しておく。

 

トークンセール開始準備

DaicoPoolをデプロイする

 

このとき、DaicoPoolのコンストラクタでVotingが自動デプロイされる。

TokenSaleManagerをデプロイする

TokenSaleManager.addTokenSale(…)でトークンセールを設定する

トークンセールの各種パラメータ(価格や期間、販売数、キャリーオーバーの有無など)を与える。

TokenSaleManagerのinitialize()を実行

必要なセールをすべて設定し終わったら、initialize()を実行することでトークンセールの設定がFixされる。

 

TokenControllerのOpenTokenSale()を実行

トークン発行権限がTokenSaleManagerに移る。以降、起案者はトークンの配布ができなくなる。

 

セール前の配布状況は誰でも確認できるので、投資家はホワイトペーパーに記載された配布比率を守っているか確認した上でこの後のセールに参加できる。

Whitelist登録を行う

起案者がTokenSaleManager.addToWhitelist(もしくはaddManyToWhitelist)を実行し、KYC済みのユーザのアドレスをホワイトリスト登録する。登録されたユーザーのみがトークンを購入できる(Whitelistは以降随時追加可能)。

 

 

トークンセール以降はすべてtrustlessで進むように設計されており、起案者でも内容を変更したり、運用を中断させたりすることはできない。その後の進行が誰にとっても明確な状態でセールが開始する。

トークンセール中

セールがオープンする

1番目のTokenSaleに設定した開始時刻を過ぎると自動的にセールがオープンする。

参加者はトークンを購入する

Whitelistに登録された購入希望者は、TokenSaleコントラクトにETHを送金することで、金額に応じたTokenを受け取る。なお、TokenSaleには最低購入価格が設定されており、これを下回る場合はトランザクションが失敗する。

 

トークンセールをfinalizeする

セールが時間経過によって終了した場合、もしくは設定されたトークンがすべて売り切れた場合、TokenSaleManager.finalize(uint256 index)でTokenSaleをfinalizeすることが可能だ。finalize操作は誰でも行うことができる。

このfinalize処理によって、TokenSaleに集められた資金はDaicoPoolに送られる(なんらかの理由でTokenSaleに資金が取り残された場合に備え、finalizeは何度でも実行できるようになっている)。また、finalizeと同時に次のTokenSaleがinitializeされる。

TokenSaleのcarryoverがtrueに設定されている場合はキャリーオーバーの処理が行われ、売れ残ったトークンが次のTokenSaleに引き継がれる。

TokenSaleManagerをfinalizeする

すべてのTokenSaleがfinalizeされるとTokenSaleManager.finalizeTokenSaleManager()を実行できる。各TokenSaleのfinalizeと同様に、この操作も誰でも行うことができる。

TokenSaleManagerのfinalizeによってDaicoPoolのTAPがオープンし、設定された初期資金のリリースと、TAP値に従った資金リリースが開始される。同時に、投票の発議が可能になる。

プロジェクト進行中

起案者はプールから資金を引き出す

DaicoPoolがスタートされたあとは、毎秒、TAP値に応じて引出し可能残高が増加していく。起案者はこの残高を引き出すことができる。

投票の発議を行う

プロジェクト進行中、誰でも一定のETHを支払うことで投票の発議を行うことができる。現在、投票の議題は、TAP増加もしくはSelf Destructionの2種類がある。

発議が行われると、直ちに投票フェイズに移行する。投票中もDaicoPoolの挙動は変わらず、資金リリースが継続され、資金の引き出しが可能である。

投票中

発議が行われると、即座に14日間の投票が開始される。

投票する

トークン保有者はトークンをVotingコントラクトに送ることで賛成/反対の投票を行うことができる。投票する前に、トークンコントラクトのapprove()で、Votingコントラクトにトークンの引き出し権限を付与しておく。

投票をfinalizeする

投票期間が終了すると、誰でもVotingのfinalizeを行うことができる。このとき、可決条件を満たしていればDaicoPoolにRaiseTapもしくはSelfDescructionのシグナルが送られる。可決条件を満たしていなければ何も起こらずに投票フェイズを終了する。

トークンの返却

finalizeが行われると、投票時に預けたトークンの引き出しが可能になる。Votingに対してreturnToken()を実行することでトークンの返却を受けられる。誰でもこのreturnToken()を実行可能で、実行者に関係なく、元の保有者にトークンが返却される。

Self Destruction可決後

Self Destruction

投票によりSelf Destructionが可決された場合、DaicoPoolは即座に30日分の資金を起案者にリリースし、TAPを閉じる。この30日分の資金はプロジェクトの手仕舞いにかかる費用を精算するためのものである。TAPが閉じると同時に、トークン保有者は資金の返却を受けることが可能になる。

資金の返却

トークン保有者は、トークンの返却と引き換えにDaicoPoolに残った資金を受け取る。受け取る資金は、SelfDestruction時にDaicoPoolに残った資金 ✕(引き換えたトークン量 /トークン総発行量)となる。

refund()を実行する前に、トークンコントラクトのapprove()によりDaicoPoolコントラクトにトークンの引き出す権限を付与しておく。

以上がDAICOVOのデプロイ・運用フローだ。

次回からは個別のコントラクトの実装を、コードレベルで解説していく。

 

Profile

解説:小幡 拓弥

ICOVO AGのCOOであり、ブロックチェーンエンジニア。2016年Blockchain HackathonにてMVP。自然言語処理や機械学習、チェスライクゲームAI開発の分野での経験を持つ。