DAICOオープンソースフレームワーク #05 DaicoPool.sol の実装

DAICOオープンソースフレームワーク #05 DaicoPool.sol の実装

この回では、調達した資金を管理するDaicoPoolについて解説する。

 

各TokenSaleコントラクトはfinalizeされる際にこのDaicoPoolに調達資金を送金する。ICOで調達したすべての資金はこのコントラクトに集められ、プロジェクト開始時からTAP値に従って徐々にリリースされる。コンストラクタは以下の通りだ。

 

 

tap_amountには、TAPの初期値[wei/sec]を与える。これは、あらかじめホワイトペーパーに宣言している値を与えるべきである。TAP値は公開情報であるため、ホワイトペーパーと異なる場合は参加者によって指摘され、信用を失う結果となる。

 

_initialReleaseについても同様で、ホワイトペーパーに記載した資金の初期リリース量を設定する。

DaicoPoolのコンストラクタ内でVotingコントラクトがデプロイされ、DaicoPoolのTAP値とSelfDestructionはVotingコントラクトに管理されることになる。

状態遷移

DiacoPoolは3つのstateを持つ。

  • Initializing(プロジェクト開始前)
    このときはまだ資金はリリースされない。TokenSaleから調達資金を受け取る。
  • ProjectInProgress(プロジェクト進行中)
    TAP値に従って資金がリリースされる。
  • Destructed(SelfDestruction済み)
    投票の結果SelfDestructionされた状態。TAPによる資金リリースは停止し、トークン保有者は返金を受けることができる。

変数

コントラクト内には以下の変数を持つ。

 

TokenSaleManagerとの関連付け

TokenSaleManagerをデプロイする際に、DaicoPoolのsetTokenSaleContract()が呼ばれることにより、DaicoPoolとTokenSaleManagerが関連付けられる。setTokenSaleConrractr()は一度しか実行できない。

 

DaicoPoolに関連付けられたTokenSaleManagerは、資金のリリースを開始するトリガーstartProject()を実行することができる。

 

資金リリースの開始

TokenSaleManagerは、トークンセールが終わってfinalizeされる際に、DaicoPoolのstartProject()を実行する。

これにより、DaicoPoolのstateがInitializingからProjectInProgressに遷移し、初期資金がリリースされ、TAP値に従った資金リリースが開始する。

 

資金の引き出し

プロジェクトの起案者(DaicoPoolのowner)は、時間の経過に応じてリリースされた資金をwithdraw()によって引き出すことができる。

withdraw()が実行されると、updateReleasedBalance()を呼び出してリリース済み残高を確認する。その後getAvailableBalance()によって引き出し可能残高(リリース済み残高−引き出し済み残高)を計算し、その額を上限に引き出しを行う。引数_amountで指定した金額、もしくは引き出し可能上限のどちらか小さいほうの金額が引き出される。

 

 

残高の更新・確認関連のfunctionは以下の3つだ。

 

TAP値の更新

DaicoPoolは、Votingコントラクトの指示によりTAP値を更新することがある。VotingでRaiseTapに関する提案が可決された場合に、以下のraiseTap()が実行され、TAP値が更新される。

 

DaicoPoolのraiseTap()としては、TAP値は増加させることも減少させることも可能だが、現在はVoting側で101〜200%の範囲に制限を入れている。これは、投票に不正があった場合の急激な変化を防ぐためである。

SelfDestruction

Votingコントラクトは、投票の結果、SelfDestructionの提案が可決されると、DaicoPoolのselfDestruction()を実行し、資金プールを「破壊」する。SelfDestructionが行われると、起案者にTAP値に基づいた30日分の資金をリリースし、TAPを閉じる。その後トークン保有者は返金を受けることが可能になる。

 

 

30日分の資金をリリースするのは、プロジェクトの手仕舞い(もしくは縮小)には費用がかかるためだ。たとえば、契約していたオフィスから退去するためには元の状態への復帰をする必要があるし、人件費をはじめとした各種経費も即日解約できる契約とは限らない。

返金

トークン保有者は、プールがSelfDestructionされていれば、トークンを返却することでETHの返金を受けることができる。返金される資金は、以下の式で表される。

 

返金される ETH = SelfDestruction後にプールに残った資金 ✕ (トークン返却数 / トークンの総発行量)

 

返金を受けるには、あらかじめトークンのapprove()によってDaicoPoolにトークンの引出し権限を付与しておく。

 

 

refund()を実行し、トークンを返却すると、トークンの量に応じて資金が返金される。

 

 

DaicoPoolの動作はこれですべてである。

 

Profile

解説:小幡 拓弥

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