LoginSignup
12
13

More than 5 years have passed since last update.

zeppelin-solidityを使ったMintとBurn

Posted at

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.solBurnableToken.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 ] }

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

参考

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13