セキュリティ
チュートリアル
Ethereum
solidity
Ethernaut

「The Ethernaut by Zeppelin Level 15. Naught Coin」を翻訳してみました(CryptoZombiesのように?)

原文はこちら

https://ethernaut.zeppelin.solutions/
15. Naught Coinをクリック

15. Naught Coin

難易度 5/6
NaughtコインはERC20トークンであり、お主は既にすべてのトークンを保持している。
しかし、Naughtコインは10年間のロックアウト期間後に、転送が可能であることを理解しなければならない、お主はいつでも自由にNaughtコインを転送できるようする為、別のアドレスを取得する方法を把握しているかな?
このレベルのクリア条件はお主のトークン残高を0にすることである。

回答の助けになるヒント
  • ERC20の仕様について
  • OpenZeppelinのコードベースについて

ソースコード

pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol';

 contract NaughtCoin is StandardToken {

  string public constant name = 'NaughtCoin';
  string public constant symbol = '0x0';
  uint public constant decimals = 18;
  uint public timeLock = now + 10 years;
  uint public INITIAL_SUPPLY = 1000000 * (10 ** decimals);
  address public player;

  function NaughtCoin(address _player) public {
    player = _player;
    totalSupply_ = INITIAL_SUPPLY;
    balances[player] = INITIAL_SUPPLY;
    Transfer(0x0, player, INITIAL_SUPPLY);
  }

  function transfer(address _to, uint256 _value) lockTokens public returns(bool) {
    super.transfer(_to, _value);
  }

  // Prevent the initial owner from transferring tokens until the timelock has passed
  modifier lockTokens() {
    if (msg.sender == player) {
      require(now > timeLock);
      if (now < timeLock) {
        _;
      }
    } else {
     _;
    }
  } 
}