solidity

21.07.22 Mint & Burn Token

슈팅스타제제 2021. 7. 24. 18:18

✔Mint : ERC-20 이더리움 토큰 발행하기 (ganache, metamask, MyEtherWallet 이용)

 

1. ubuntu에서 토큰 발행하기 작업을 할 폴더를 하나 만든다. 

mkdir mint
cd mint

2. truffle, npm 새 프로젝트를 생성한다. -y 옵션을 추가하면 프로젝트 환경을 모두 default로 설정하여 생성된다.

truffle init
ls -al
npm init -y 
ls -al

ls -al로 폴더 구조를 확인한다. 

3. 토큰 컨트랙트를 개발할 수 있는 npm 모듈인 openzeppelin을 설치한다. 

npm install @openzeppelin/contracts

4. mint 폴더에서 code . 명령어를 입력하여 VS code를 실행한다. 프로젝트를 생성하면 볼 수 있는 기본 폴더 구조이다. 

 

5. 먼저 contracts 폴더에 MyToken.sol 파일을 다음과 같이 추가한다. 

//SPDX-License-Identifier:MIT
pragma solidity >=0.4.22 < 0.9.0; //솔리디티 사용 버전의 범위를 설정한다. 

import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20, AccessControl{
	bytes32 public constant MINTER_ROLE = keccack256("MINTER ROLE");
    
    constructor() ERC20("MyToken", "MTK"){ //이름 같아도 된다. contract address가 다르기 때문에
    	_setupRole(MINTER_ROLE, minter);
    }
    function mint (address to, uint256 amount) public{
    	require(hasRole(MINTER_ROLE, msg.sender), "Caller is not a minter");
        _mint(to, amount);
    }
}

6. 그리고 migrations폴더에 2_deploy_migration.js 파일을 추가한다. 

const MyToken = artifacts.require("MyToken");

module.exports = function (deployer) {
  deployer.deploy(MyToken);
};

7. 최상위 폴더에 있는 truffle-config.js 파일에서 44~48번 줄의 주석 처리를 해제한다. 

8. 84번 줄을 주석 처리를 해제하고 version을 0.5.1에서 0.8.0으로 바꾼다.

9. truffle로 코드를 컴파일한 후 migrate해준다. 

truffle compile;
truffle migrate; //처음할 때 
truffle migrate --reset //n번째 시도일 때

compile을 실행하고

migrate을 실행하면 contract address를 얻는다.

10. 다른 우분투 창에 가나쉬 클라이언트를 실행시켜서 test account private key를 얻는다. 

ganache-cli

 

11. MyToken.json에서 abi를 copy한다.

12. MEW (MyEtherWallet.io)에 접속하여 토큰 컨트랙트를 등록하기 전에 MetaMask 계정을 연결해준다.

13. MEW의 interact with Contract에 truffle migrate 후에 얻은 contract address와 copy한 ABI를 paste 한다. 

14. metamask에서 추가한 테스트 계정에서 contract address를 입력하여 토큰을 추가하고 

15. Mint의 to (address)에는 어떤 계정에 토큰을 발행해줄지 입력하고 amount에는 얼마만큼의 토큰을 발행할지 입력한다.

여기서는 metamask를 연결한 계정인 account2의 address를 추가한다.

16. 다음과 같은 과정을 거치면 

17. account2 자산에 입력한 amount(나는 2000)만큼 토큰이 발행된 것을 확인할 수 있다. 

✔Burn : ERC-20 이더리움 토큰 태우기 (ganache, metamask, MyEtherWallet 이용)

 

1. Minting Token에서의 MyToken.sol 파일에서 다음과 같이 코드를 추가하여 수정한다. 

이때, mint 함수와 burn 함수에 onlyRole 권한을 부여하면 require() 조건이 굳이 필요하지는 않기 때문에 주석 처리해도 상관없다. 

// SPDX-License-Identifier: MIT

pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20, AccessControl{
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    //추가한 코드
    bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
    address minter = msg.sender;
    //추가한 코드
    address burner = msg.sender;

    constructor() ERC20("MyToken", "MTK"){
        _setupRole(MINTER_ROLE, minter);
        //추가한 코드
        _setupRole(BURNER_ROLE, burner);
    }

    function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE){
        require(hasRole(MINTER_ROLE, msg.sender), "Caller is not a minter");
        _mint(to, amount);
    }

	//추가한 코드
    function burn(address from, uint256 amount)public onlyRole(BURNER_ROLE){
        require(hasRole(BURNER_ROLE, msg.sender), "Caller is not a burner");
        _burn(from, amount);
    }
}

 

2. 다시 truffle compile --all과 migrate --reset을 해서 contract address를 얻어서 다시 interact with contracts를 연결한다. 

 

3. Burn Method를 선택하여 minting했던 account2의 address를 입력하고 2000에서 1000을 없애고 싶으면 1000에 0을 18개 더해서 입력해준다. 

4. burn이 성공적으로 실행되면 다음과 같이 account2의 자산에 토큰이 1000만 남는 것을 확인할 수 있다. 

 

✔궁금한 점

mint, burn하는 이유는 토큰의 인플레이션을 줄이기 위해서 라고 한다.

인플레이션의 gradient에 따라 일일이 사람이 tolerance를 계산해서 mint, burn해야 하는 것인가?

mint, burn하는 프로세스를 자동화할 수는 없을까? 

'solidity' 카테고리의 다른 글

21.07.28 diamond problem  (0) 2021.07.28
21.07.27 ERC-20 Token Contract  (0) 2021.07.28
21.07.23 Token Role  (0) 2021.07.26
21.07.15 import, inheritance, storage, memory  (0) 2021.07.16
21.07.15 mapping, msg.sender, require  (0) 2021.07.16