クリプト

ALISのICOスマートコントラクトを読む③

kenjiszk's icon'
  • kenjiszk
  • 2018/05/07 23:35
Content image

前回に引き続き、AlisCrowdsale.solを読み進めます。importしているライブラリの解読までが終わっていたので、いよいよAlis独自のオーバーライドしている部分を読んでいきます。

https://github.com/AlisProject/ico-contracts/blob/master/contracts/AlisCrowdsale.sol


AlisCrowdsaleオーバーライド部分

まず、本体のAlisCrowdsaleですが、Crowdsale、CappedCrowdsale、RefundableCrowdsale、WhitelistedCrowdsaleがくっついています。WhitelistedCrowdsaleだけまだ前回記事で説明していないので見て見ます。


WhitelistedCrowdsale

https://github.com/AlisProject/ico-contracts/blob/master/contracts/WhitelistedCrowdsale.sol

簡単に説明すると、whiteListというmappingに特権ウォレットアドレスを設定している処理です。あとで使うのでしょう。


それでは、独自実装部分をそれぞれ見ていきます。

createTokenContract

これは、元々はMintableTokenを発行していますが、独自のAlisTokenを発行するように変更されています。

function createTokenContract() internal returns (MintableToken) {
   return new AlisToken();
}


validPurchase

CappedCrowdsaleのvalidPurchaseをオーバーライドしています。元々のロジックは、イーサリアムのキャップを設定されていましたが、ここではAlistTokenの発行上限も確認しているようです。super.validPurchase()も読んでいますので、イーサリアムの上限とAlisトークンの上限を同時にチェックしています。

function validPurchase() internal constant returns (bool) {
  bool withinTokenCap = token.totalSupply().add(msg.value.mul(getRate())) <= tokenCap;
  return super.validPurchase() && withinTokenCap;
}


hasEnded

こちらもAlisTokenのキャップに達したかどうかを確認していますが、validPurchaseと異なるのが最後のreturnがor条件になっている部分です。ですので、イーサリアムの上限に達したか、Alisトークンの上限に達したかいずれかの場合にクラウドセールは終了します。

function hasEnded() public constant returns (bool) {
  bool tokenCapReached = token.totalSupply() >= tokenCap;
  return super.hasEnded() || tokenCapReached;
}


finalization

次は、finalization()です。クラウドセールを終わらせる処理ですが、3行ほどコメントが書いてあります。

tokenCapからtoken.totalSupplyを引いているので、実際に発行したトークンと設定されているトークン発行リミットの差分、つまり残り(remaining)ということになります。この残りをmintしているので、端数分を発行してしまってキリよくする、という感じでしょうか(もっと深遠な理由があるのかもしれません、ご存知の方いたらご指摘ください)。

その後、トークンの所有権をAlisFundが持っているwalletに移し、ICOのゴールに到達したかどうかを確認します。到達していればそのまま終了、していなければRefundを行う、という形になっています。

// - To store remaining ALIS tokens.
// - To minting unfinished because of our consensus algorithm.
// - https://alisproject.github.io/whitepaper/whitepaper_v1.01.pdf
function finalization() internal {
  uint256 remaining = tokenCap.sub(token.totalSupply());
  if (remaining > 0) {
    token.mint(wallet, remaining);
  }
  // change AlisToken owner to AlisFund.
  token.transferOwnership(wallet);
  // From RefundableCrowdsale#finalization
  if (goalReached()) {
    vault.close();
  } else {
    vault.enableRefunds();
  }
}


buyTokens

トークンの購入部分。プリセール用の分岐が書かれています。

checkLimitはWhitelistedCrowdsale.solに書かれている関数で、どうやらプリセールスのためのアカウントリスト(whitelist)のために購入上限を設定していたようです。

その後、getRate(後述)を使ってイーサリアムをAlisトークンに変換し、その分だけトークンをmintしています。

function buyTokens(address beneficiary) payable {
  require(!paused);
  require(beneficiary != 0x0);
  require(validPurchase());
  require(saleAccepting());
  uint256 weiAmount = msg.value;
  // for presale
  if ( isPresale() ) {
    checkLimit(weiAmount);
  }
  // calculate token amount to be created
  uint256 tokens = weiAmount.mul(getRate());
  // update state
  weiRaised = weiRaised.add(weiAmount);
  token.mint(beneficiary, tokens);
  TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
  forwardFunds();
}


getRate

getRateはその名の通り、イーサリアムとトークンの変換レートです。

ただのif分ですが、時間に合わせて変換レートを変更しています。この値の変換レートはwhitepaperに書いてある通りです。

function getRate() constant returns (uint256) {
  uint256 currentRate = rate;
  // We decided using `now` alias of `block.timestamp` instead `block.number`
  // Because of same reason:
  // - https://github.com/OpenZeppelin/zeppelin-solidity/issues/350
  if (isPresale()) {
    // before 2017/09/01 02:00 UTC
    currentRate = RATE_PRE_SALE;
  } else if (now <= icoStartTime.add(1 weeks)) {
    // before 2017/09/08 02:00 UTC
    currentRate = RATE_WEEK_1;
  } else if (now <= icoStartTime.add(2 weeks)) {
    // before 2017/09/15 02:00 UTC
    currentRate = RATE_WEEK_2;
  } else if (now <= icoStartTime.add(3 weeks)) {
    // before 2017/09/21 02:00 UTC
    currentRate = RATE_WEEK_3;
  }
  return currentRate;
}


以下二つは条件判定。

function saleAccepting() internal constant returns (bool) {
  return !isPresale() || isWhiteListMember(msg.sender);
}
function isPresale() internal constant returns (bool) {
  return now <= icoStartTime;
}

ということで、AlisCrowdsaleの独自で実装していう部分を見ていきました。基本的にはopenzeppelin-solidityで定義されている関数をオーバーライドしている感じですね。


次は、AlisFund(マルチシグ)を見ていきます。

ALISのICOスマートコントラクトを読む④

公開日:2018/05/07
獲得ALIS:14.52
kenjiszk's icon'
  • kenjiszk
  • @kenjiszk
エンジニア。ブロックチェーン勉強中。

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

17万円のPCでTwitterやってるのはもったいないのでETHマイニングを始めた話

Like token Tip token
46.60 ALIS
Eye catch
クリプト

ジョークコインとして出発したDogecoin(ドージコイン)の誕生から現在まで。注目される非証券性🐶

Like token Tip token
38.31 ALIS
Eye catch
クリプト

Uniswap(ユニスワップ)で$ALISのイールドファーミング(流動性提供)してみた

Like token Tip token
59.99 ALIS
Eye catch
クリプト

【DeFi】複利でトークンを運用してくれるサイト

Like token Tip token
54.01 ALIS
Eye catch
クリプト

クリプトスペルズで入手したMCHCを引き出す方法

Like token Tip token
196.20 ALIS
Eye catch
クリプト

2021年1月以降バイナンスに上場した銘柄を140文字以内でざっくりレビュー(Twitter向け情報まとめ)

Like token Tip token
38.10 ALIS
Eye catch
クリプト

【初心者向け】$MCHCの基本情報と獲得方法

Like token Tip token
32.32 ALIS
Eye catch
クリプト

Eth2.0のステークによるDeFiへの影響を考える。

Like token Tip token
44.10 ALIS
Eye catch
クリプト

Polygon(Matic)で、よく使うサイト(DeFi,Dapps)をまとめてみた

Like token Tip token
236.30 ALIS
Eye catch
クリプト

コインチェックに上場が決まったEnjin Coin(エンジンコイン)コインを解説

Like token Tip token
21.49 ALIS
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

Like token Tip token
947.13 ALIS
Eye catch
クリプト

CoinList(コインリスト)の登録方法

Like token Tip token
15.55 ALIS