openZepplin - Crowdsaleまとめ

Takemoto Tetsuro
iNeeza!
Published in
20 min readJun 14, 2018

openZepplin

参考: https://openzeppelin.org/api/docs/crowdsale_Crowdsale.html

Crowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/v1.8.0/contracts/crowdsale/Crowdsale.sol
Crowdsaleはトークンクラウドセールをマネージメントする基本的なコントラクトです。
Etherを使って投資家がトークンを購入することができるようになります
このコントラクトは、そのような機能を最も基本的な形態で実装しており、追加の機能性および/またはカスタム動作を提供するために拡張することができます。
外部インターフェイスは、トークンを購入するための基本インターフェイスを表し、crowdsalesの基本アーキテクチャに準拠しています。それらは変更/上書きされることは意図されていません。
内部インターフェイスは、crowdsalesの表面を拡張可能で変更可能に適応しています。機能を追加するメソッドをオーバーライドします。振る舞いを連結するために適切な場合は、 ‘super’を使用することを検討してください。

Events

TokenPurchase()

event TokenPurchase(address purchaser, address beneficiary, uint256 value, uint256 amount)

トークン購入のログを取得するイベント

Param

purchaser(indexed) - トークンを買った人
beneficiary(indexed) - トークンを受け取った人
value - 購入者が支払ったwei
amount - 購入されたトークンの合計

Functions

Crowdsale()

function Crowdsale(uint356 _rate, address _wallet, ERC20 _token) public

Param

_rate - 購入者が手に入れるwei換算のトークン量
_wallet - ファンドを集めている送れられる先のアドレス
_token - 販売されているトークンのアドレス

_deliverTokens()

function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal

トークンのソース
このメソッドをオーバーライドしてクラウドセールがトークンを取得、送信する方法を変更します

Param

_beneficiary - トークンの購入を行うアドレス
_tokenAmount - 放出されるトークンの量

_forwardFunds()

function _forwardFunds() internal

購入時ETHを保存/転送するかを決めます

_getTokenAmount()

function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) 

Etherがトークンにコンバートされる方法を拡張するためのオーバーライド

Param

_weiAmount - トークンへコンバートされるweiの価値

Returns

_weiAmountで購入されうるトークンの数

_postValidatePurchase()

function _postValidatePurchase(address _beneficiary, uint256 _weiAmount) internal

実行された購入の検証。
有効な条件が満たされていない場合は、状態を観察し、revert文を使用してロールバックを元に戻します。

Param

_beneficiary - トークンの購入を実行するアドレス
_weiAmount - 購入者の持つweiの量

_preValidatePurchase()

function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal

購入が入るときのバリデーション
条件に満たされない場合に状態を戻す場合はrequireステートメントを使います
バリデーションを連結させる場合はsuperを使ってください

Param

_beneficiary - 購入を実行するアドレス
_weiAmount - 購入に関するweiの値

_processPurchase()

function _processPurchase(address _beneficiary, uint256 _tokenAmount) internal

購入が検証され、実行準備が整うと実行されます。必ずしもトークンを放出/送信する必要はありません。

Param

_beneficiary - トークンを受け取っているアドレス
_tokenAmount - 購入されたトークンの数

_updatePurchasingState()

function _updatePurchasingState(address _beneficiary, uint256 _weiAmount) internal

内部状態の正当性チェック(現在のユーザーの寄付など)を必要とする拡張のためのオーバーライド

Param

_beneficiary - トークンを受け取っているアドレス
_weiAmount - 購入に関するweiの値

buyTokens()

function buyTokens(address _beneficiary) public payable

低レベルのトークン購入
オーバーライドしないでください

Param

_beneficiary - 購入を実行するアドレス

fallback()

function () external payable

予備機能
オーバーライドしないでください

FinalizableCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/distribution/FinalizableCrowdsale.sol
finalizeはオーナー権限を持つ人のみ
timedCrowdSale の hasClosed() でtureが帰ってきていると finalizeを実行しisFinalized = trueにできる
finalization関数は拡張可能

Events

Finalized()

event Finalized()

コントラクトが実行されたとき通知できる

Functions

finalization()

function finalization() internal

finalization logicを追加するためにオーバーライド可能
super.finalization()をcallすることで確実にfinalization chainが実行されます

finalize()

function finalize() public

クラウドセールが終了後呼ばれなければならない
modifiers onlyOwner

PostDeliveryCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/distribution/PostDeliveryCrowdsale.sol
timedCrowdsale継承
クラウドセール終了までユーザーによるトークンの引き出しからトークンをロックするクラウドセール
balances[]はaddress: uint256(購入分のトークン量)で格納される配列

Functions

_processPurchase()

function _processPurchase(address _beneficiary, uint256 _tokenAmount) internal

親の関数の上書き
すぐにトークンを発行する代わりに保持分(balances)を保存する

Param

_beneficiary - トークン購入者
_tokenAmount - 購入されたトークンの合計

withdrawTokens()

function withdrawTokens() public

クラウドセールが終了しているときのみ引き出す

RefundableCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/distribution/RefundableCrowdsale.sol
クラウドセールの拡張
ファンディングのゴールを追加
ゴールに達しなかった場合ユーザーにファンドしたETHを返す機能の追加

Functions

RefundableCrowdsale()

function RefundableCrowdsale(uint256) public

コンストラクタ、RefundVaultを作成する

Param

_goal - ファンディングのゴール

_forwardFunds()

function _forwardFunds() internal

Crowdsaleのfund forwardingを上書きし、fundに資金を送金する

claimRefund()

function claimRefund()

(ファンディング終了後)ゴールに達しなかった場合ユーザーがrefundを実行できる

goalReached()

function goalReached() public view returns (bool)

ファンディングがゴールに達したかどうかチェックする

Returns

weiRaised(ファンドされたETH)がgoalを超えていればtrueを返す関数

finalization()

function finalization() internal

コントラクト内からしか呼べない関数
ownerがfinalize()をcallしたとき実行される
ファンディングが終了していれば実行可能
goalに達してしなければvaultをrefund可能状態にする

AllowanceCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/emission/AllowanceCrowdsale.sol
Crowdsale継承
トークンを持つウォレットをクラウドセールでallowanceとして承認するクラウドセール拡張

Functions

AllowanceCrowdsale()

function AllowanceCrowdsale(address _tokenwallet) public

トークンウォレットアドレスを取得する

Param

_tokenWallet - クラウドセールででallowanceとして承認されたトークン
を保持しているaddress

_deliverTokens()

function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal

親関数のふるまいの拡張
ウォレットからトークンを送る

Param

_beneficiary - トークン購入者
_tokenAmount - 購入されたトークンの合計

remainingTokens()

function remainingTokens() public view returns (uint256)

allowanceに残っているトークン量の合計をチェックする

Returns

allowanceに残っている合計のトークン数

MintedCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/emission/MintedCrowdsale.sol
Crowdsaleコントラクト拡張
鋳造可能なトークンセール
各々の購入者によってトークンが鋳造されるクラウドセール拡張
鋳造のためにトークンの所有権をMintedCrowdsaleコントラクトに譲渡する必要がある

Functions

_deliverTokens()

function_deliverTokens(address _beneficiary, uint256 _tokenAmount) internal

購入時にミントトークンによる配信を上書きする

Param

_beneficiary - トークン購入者
_tokenAmount - トークン鋳造量

IncreasingPriceCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/price/IncreasingPriceCrowdsale.sol
crowd sale拡張TimedCrowdsaleを継承している
線形時間でトークンの価格を上昇させるクラウドセール拡張コントラクト
コンストラクタに開始と終了のレートを設定する必要がある
レートは1weiあたりに配られるのトークン量
開始レートは終了レートよりも大きくなくてはならない

Functions

IncreasingPriceCrowdsale()

function IncreasingPriseCrouwdsale(uint256 _initialRate, uint256 _finalRate) public

コンストラクタに開始と終了のレート(1weiあたりのトークン量)を設定する

Require

_initialRateは_finalRateよりも大きい
_finalRateは0以上

Param

_initialRate - クラウドセール開始時に購入者が得られるwei換算のトークン数 
_finalRate - クラウドセール終了時に購入者が得られるwei換算のトークン数

_getTokenAmount()

function _getTokenAmount(_uint256 _weiAmount) internal view returns (uint256)

Param

_weiAmount -トークンへ コンバートされるweiの値

Returns

現時点での_weiAmount wei で購入できるトークンの量

getCurrentRate()

function getCurrentRate() public view returns (uint256)

現在のtoken/weiのレートを返します
時間とともに価格は上昇し、レートは減少することに注意してください

Returns

受け取った時間時点の購入者手が購入できるwei換算のトークン量

CappedCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/validation/CappedCrowdsale.sol
クラウドセールに総量の制限を設ける

Functions

CappefCrowdsale()

function CappefCrowdsale(uint256 _cap) public

クラウドセールで受け入れる最大のwei数を設定する

Require

_capは0以上

Param

_cap - 寄付される最大のwei数

_preValidatePurchase()

function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal

親の関数の振る舞いを拡張する
購入者にファンディングのcapを尊重させる

Param

_bemeficiary - トークン購入者
_weiAmount - 寄付されるweiの合計

capReached()

function capReached() public view returns (bool)

capに達したかどうかをチェックする

Returns

capに到達したかどうかをbooleanでかえす

IndividuallyCappedCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/validation/IndividuallyCappedCrowdsale.sol
Crowdsale, ownable継承

Functions

_preValidatePurchase()

function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal

親の関数の振る舞いを拡張する
購入者にファンディングのcapを尊重させる?

Param

_bemeficiary - トークン購入者
_weiAmount - 寄付されるweiの合計

_updatePurchasingState()

function _updatePurchasingState(address _beneficiary, uint256 _weiAmount) internal

親の関数の振る舞いを拡張する
ユーザーの寄付を上書きするため

Param

_beneficiary - トークン購入者
_weiAmount - 寄付されるweiの合計

getUserCap()

function getUserCap(address _beneficiary) public view returns (uint256)

特定のユーザーのcapを返す

Param

_beneficiary - capをチェックされている人のアドレス

Returns

特定のユーザーの現在のcap

getUserContribution()

function getUserContribution(address _beneficiary) public view returns (uint256)

特定のユーザーによるこれまでの寄付の総量を返す

Param

_beneficiary - 寄付者のアドレス

Returns

ユーザーがこれまで寄付した量

setGroupCap()

function setGroupCap(address[] _beneficiaries, uint256 _cap) external

寄付最大数が決められたユーザーのグループを設定する
modifier onlyOwner

Param

_beneficiary - capされてるアドレスのリスト
_cap - 個人寄付の制限wei数

setUserCap()

function setUserCap(address _beneficiary, uint256 _cap) external

特定のユーザーの寄付最大数を設定する
modifier onlyOwner

Param

_beneficiary - capされてるアドレスのリスト
_cap - 個人寄付の制限wei数

TimedCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/validation/TimedCrowdsale.sol
modifier onlyWhileOpen
block.timestamp >= openingTime && block.timestamp <= closingTime
じゃないと実行できないようにする修飾子

Functions

TimedCrowdsale()

function TimedCrowdsale(uint256 _openningTime, uint256 _closingTime) public

コンストラクタ

Required

openingTimeは現在のblock.timestamp以降の値でなければならない
closingTimeはopeningTime以降の値でなければならない

Param

_openingTime - クラウドセール開始時間
_closingTime - クラウドセール終了時間

hasClosed()

function hasClosed() public view returns (bool)

booleanで現在のクラウドセールが開始か終了か返してくれる

Returns

クラウドセール中か、すでに終了しているかをbooleanで返す

_preValidatePurchase()

function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal

親の関数振る舞いの拡張onlyWileOpenの期間内である必要がある
modifier onlyWileOpen

Param

_beneficiary - トークン購入者 
_weiAmount - 寄付されるトークンの合計

WhitelistedCrowdsale.sol

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/crowdsale/validation/WhitelistedCrowdsale.sol
Crowdsale, ownable継承
ホワイトリストに定義されたユーザーのみ寄付可能なクラウドセール
address[]はaddress: booleanで格納される配列

modifier

isWhitelisted

modifier isWhitelisted(address _beneficiary)

ホワイトリストに記載されてないアドレスの場合拒否する
このコントラクトを拡張するとき使うことができる

Functions

_preValidatePurchase()

function_preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal

親の関数の振る舞いを拡張する
購入者にファンディングのcapを尊重させる?

Param

_bemeficiary - トークン購入者
_weiAmount - 寄付されるweiの合計

addManyToWhitelist()

function addManyToWhitelist(address[] _beneficiaries) external

複数のアドレスをホワイトリストに追加する
truffle testの制限によって過負荷にならない

modifier

onlyOwner

Param

_beneficiaries - ホワイトリストに追加される複数のアドレス

addToWhitelist()

function addToWhitelist(address _beneficiary) external

単体のアドレスをホワイトリストに追加する

modifier

onlyOwner

Param

_beneficiary - ホワイトリストに追加されるアドレス

removeFromWhitelist()

function removeFromWhitelist(address _beneficiary) external

ホワイトリストから単体のアドレスを削除する

Modifiers

onlyOwner

Param

_beneficiary - ホワイトリストから削除されるアドレス

--

--