zeppelin-solidityを使ったMintとBurn

# MintとBurn
Mintは、TokenやCoinを鋳造する、つまり増やす行為。
Burnは、TokenやCoinを燃やす、つまり減らす行為。
ICOや何かで独自のTokenを作った場合に、それを増やしたり減らしたりするときにつかわれる。zeppelin-solidityのクラウドセールではEtherを送ってきた場合に、都度MintしてEtherの送金主に送られるなどの使い方がされている。
またICOが終了した場合に不要なTokenを減らしてTokenの価値を高めたりするのにBurnは使われる
zeppelin-solidityのライブラリを使えば比較的容易にTokenに組み込むことができてしまうが、なかなか使い方が解り難かったりしたので、自分のやり方を書いてみます

# Tokenを作成
以前に作ったトークンを弄ってMintとBurnが出来るようにする

```minaToken.sol
pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";

contract minaToken is MintableToken , BurnableToken {
  string public name = "minaToken";
  string public symbol = "MNTK";
  uint public decimals = 3;
  uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);
  address public owner;

  function minaToken() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
    owner = msg.sender;
  }
}
```

importで、```MintableToken.sol```と```BurnableToken.sol```を挿入する

```
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";
```

上で入れたライブラリを継承するようにする

```
contract minaToken is MintableToken , BurnableToken {
```

基本的にこれだけ

あとは自分の環境ではすでにデプロイしたものだったので、```-r```のオプションで再デプロイ

```
truffle(develop)> migrate -r
```

# コンソールからMintとBurn
truffleコマンドによる接続してからMintやBurnを実施
まずTokenのインスタンスを作成する

```
truffle(develop)> inst = minaToken.at(minaToken.address)
```

作ったインスタンスを使いアカウントの残高を確認。
私の場合、```INITIAL_SUPPLY = 10000```と```(10 * decimals 3)```の為に```10000000```が初期のアカウントに発行されている

```
truffle(develop)> inst.balanceOf(web3.eth.accounts[0])

BigNumber { s: 1, e: 7, c: [ 10000000 ] }
```

Mintを実施。
発行先のアドレスと発行数を指定する

```
truffle(develop)> inst.mint(web3.eth.accounts[0],1000)

{ tx: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
  receipt: 
   { transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
     transactionIndex: 0,
     blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
     blockNumber: 5,
     gasUsed: 38065,
     cumulativeGasUsed: 38065,
     contractAddress: null,
     logs: [ [Object], [Object] ],
     status: '0x01',
     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000010000008000000000000000000010000000000000000000000000000020000000000000000000800000000000000400000000010000000000000000000000000000000000000000000000000000000000000010000000002000080000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000004000000000000020000000000000000000000000000000000000000000000000000010000000000000' },
  logs: 
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
       blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
       blockNumber: 5,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Mint',
       args: [Object] },
     { logIndex: 1,
       transactionIndex: 0,
       transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
       blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
       blockNumber: 5,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Transfer',
       args: [Object] } ] }
```

発行したあと残高を確認すると、指定した1000増えている事が確認できる

```
truffle(develop)> inst.balanceOf(web3.eth.accounts[0])

BigNumber { s: 1, e: 7, c: [ 10001000 ] }
```

続いて発行した分をBurnしてみru
Burnの場合は、アドレスは指定できず接続したCoinbaseのアカウントからBurnされるようだ

```
truffle(develop)> inst.burn("1000")

{ tx: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
  receipt: 
   { transactionHash: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
     transactionIndex: 0,
     blockHash: '0x2322be05ad44516dda63a5236acfa640d4fa112b4e01223c90a1270f061c55c5',
     blockNumber: 6,
     gasUsed: 34459,
     cumulativeGasUsed: 34459,
     contractAddress: null,
     logs: [ [Object] ],
     status: '0x01',
     logsBloom: '0x00000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000010000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000010000200002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000010000000000000' },
  logs: 
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
       blockHash: '0x2322be05ad44516dda63a5236acfa640d4fa112b4e01223c90a1270f061c55c5',
       blockNumber: 6,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Burn',
       args: [Object] } ] }
```

成功したら残高を確認する

```
truffle(develop)> inst.balanceOf(web3.eth.accounts[0])

BigNumber { s: 1, e: 7, c: [ 10000000 ] }
```

解ってしまえば簡単な事ではあったけど、このやり方はあまり推奨されてないのかもしれない


# 参考
- [zeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity)
- [Doc zeppelin-solidity:MintableToken](https://openzeppelin.org/api/docs/token_ERC20_MintableToken.html)
- [Doc zeppelin-solidity:BurnableToken](https://openzeppelin.org/api/docs/token_ERC20_BurnableToken.html)