openZepplin - Crowdsaleまとめ
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 - ホワイトリストから削除されるアドレス