マルクストーケン：トーケンの例


#ソルソコード
この記事では、独自のトークンを簡単に作成する方法を紹介します。

```solidity:MarkusToken.sol
pragma solidity ^0.4.25;


import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/math/SafeMath.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";


contract MarkusToken is IERC20, ERC20Detailed {
  using SafeMath for uint256;

  mapping (address => uint256) private _balances;
  mapping (address => mapping (address => uint256)) private _allowed;
  uint256 private _totalSupply;
  
  constructor() public ERC20Detailed("Markus Xamuel Viola", "MXV", 18) {
        _balances[msg.sender] = 50000000000;    
        _totalSupply = 60000000000;
  }
  
  function totalSupply() public view returns (uint256) {
    return _totalSupply;
  }
  
  function balanceOf(address owner) public view returns (uint256) {
    return _balances[owner];
  }
  
  function allowance(address owner, address spender) public view returns (uint256)
  {
    return _allowed[owner][spender];
  }

  function transfer(address to, uint256 value) public returns (bool) {
    _transfer(msg.sender, to, value);
    return true;
  }

  function approve(address spender, uint256 value) public returns (bool) {
    require(spender != address(0));

    _allowed[msg.sender][spender] = value;
    emit Approval(msg.sender, spender, value);
    return true;
  }

  function transferFrom(address from, address to, uint256 value)
    public
    returns (bool)
  {
    require(value <= _allowed[from][msg.sender]);

    _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
    _transfer(from, to, value);
    return true;
  }

  function increaseAllowance(address spender, uint256 addedValue) public returns (bool)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].add(addedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    return true;
  }

  function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].sub(subtractedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    return true;
  }
  
  function _transfer(address from, address to, uint256 value) internal {
    require(value <= _balances[from]);
    require(to != address(0));

    _balances[from] = _balances[from].sub(value);
    _balances[to] = _balances[to].add(value);
    emit Transfer(from, to, value);
  }
  
}
```
#討論
このセクションでは、独自のERC20トークンを作成するために、コードスニペットについて説明します。コーディングを始めよう！

##ライブラリ
トークンを作成するために3つのライブラリを追加しました。
- IERC20：ERC20トークン標準テンプレート用。
- ERC20Detailed：あなたのトークンをプロファイリングするためのものです。
- SafeMath：最適化された安全な数学演算用。


```
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/math/SafeMath.sol";
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
```
## コンストラクタと変数
このセクションでは、3つのプライベート変数を設定しました。
- Balance: ウォレット残高の場合。
- Allowed: 転送制限です。
- Total Supply:トークンの供給量です。

コンストラクターでは、ERC20Detailedに契約を延長して必要な情報を追加しました。
- Name: 通貨の作成者です。
- Symbol: 通貨の名前です。
- Decimal:トークンディバイダ。

コンストラクタは1回だけ実行されるので、私は自分が望む量にバランスを設定できます。 総供給量と同じです。

```
  mapping (address => uint256) private _balances;
  mapping (address => mapping (address => uint256)) private _allowed;
  uint256 private _totalSupply;

  constructor() public ERC20Detailed("Markus Xamuel Viola", "MXV", 18) {
        _balances[msg.sender] = 50000000000;    
        _totalSupply = 60000000000;
  }
```
## 基本
- balanceOf: Ethereumアドレスのトークンバランスを返します。
- transfer: 選択した住所に金額を振り替える。
- approve: 指定されたアドレスが費やすことができるトークンの量を設定します。
- allowance:私たちに代わってどれくらいの住所が費やされるかを確認する。
- transferFrom: そのアドレスがいくつかのトークンを使うことを許可されている場合、そこから転送するアドレスを指定します。
- event Transfer & event Approval: 出力イベントをブロックチェーンに記録します。

```  
  function totalSupply() public view returns (uint256) {
    return _totalSupply;
  }

  function balanceOf(address owner) public view returns (uint256) {
    return _balances[owner];
  }

  function allowance(address owner, address spender) public view returns (uint256)
  {
    return _allowed[owner][spender];
  }

  function transfer(address to, uint256 value) public returns (bool) {
    _transfer(msg.sender, to, value);
    return true;
  }

  function approve(address spender, uint256 value) public returns (bool) {
    require(spender != address(0));

    _allowed[msg.sender][spender] = value;
    emit Approval(msg.sender, spender, value);
    return true;
  }

  function transferFrom(address from, address to, uint256 value) public returns (bool) {
    require(value <= _allowed[from][msg.sender]);

    _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
    _transfer(from, to, value);
    return true;
  }

  function increaseAllowance(address spender, uint256 addedValue) public returns (bool)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].add(addedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    return true;
  }

  function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].sub(subtractedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    return true;
  }

  function _transfer(address from, address to, uint256 value) internal {
    require(value <= _balances[from]);
    require(to != address(0));

    _balances[from] = _balances[from].sub(value);
    _balances[to] = _balances[to].add(value);
    emit Transfer(from, to, value);
  }
```
#確認する
コードは完成したので、Ethereum Remixでこれを試すことができます。 自分でデプロイしてテストする。
https://remix.ethereum.org/


Contract Address: 
0xf88cfe808bdc2fcc50715f08143bae84e4563f3f

My Wallet: 
0xda1f876435f34756acda6492b1e061c31d1ae52d (新しいトークンを送ってください！)