[BlockChain] ERC20 Token 만들기

2022. 12. 6. 10:49·개발/BlockChain
728x90
반응형

1. 초기 설정

트러플 초기 설정

npx truffle init

truffle-config.js

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "7722",
    },
  },

  compilers: {
    solc: {
      version: "0.8.17",
    },
  },
};

가나쉬 실행

npx ganache-cli --chainId 7722 --networkId 7722

2. 스마트 컨트랙트

(1) contracts/ERC20.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract ERC20{
    // 표준토큰 규격
    string public name; // 토큰의 이름
    string public symbol; // 토큰의 단위
    uint public decimals = 18; // 소수점자리
    uint public totalSupply; //총 발행량
    mapping(address=>uint) public balances;
    mapping(address=>mapping(address=>uint)) public allowance;
   
    function balanceOf(address _account) view external returns(uint){
        return balances[_account];
    }
    
    // 잔액을 전송하는 함수
    function transfer(address _recipient, uint _amount) external returns(bool){
        balances[msg.sender] -= _amount;
        balances[_recipient] += _amount;
        emit Transfer(msg.sender,_recipient,_amount);
        return true;
    }

    function approve(address _spender, uint _amount) external returns(bool){
        allowance[msg.sender][_spender] = _amount;
        emit Approval(msg.sender,_spender,_amount);
        return true;
    }

    function transferFrom(address _sender,address _recipient,uint _amount) external returns(bool){
        require(allowance[_sender][msg.sender] >= _amount);

        allowance[_sender][msg.sender] -= _amount;
        balances[_sender] -= _amount;
        balances[_recipient] += _amount;
        emit Transfer(_sender,_recipient,_amount);
        return true;
    }

    function mint(uint _amount) internal{
        balances[msg.sender] += _amount;
        totalSupply += _amount;
        // address(0) from 값이 필요 없기 때문에 null로 넣어준것
        emit Transfer(address(0), msg.sender, _amount);
    }

    // 토큰 소각
    function burn(uint amount) external{
        balances[msg.sender] -= amount;
        totalSupply -= amount;
        // address(0) to 값이 필요 없어서 null
        emit Transfer(msg.sender,address(0),amount);
    }

    // Transfser 이벤트 함수 등록
    event Transfer(address from, address to,uint value);
    event Approval(address owner,address spender,uint value);
}

(2) contracts/SEOKToken.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "./ERC20.sol";

// 컨트랙트 SEOKToken에 상송id로 ERC20를 상속
contract SEOKToken is ERC20{
    address public owner; // 이 컨트랙트의 배포자가 할당될 상태 변수
    uint256 public ethCanBuy = 200; // 1ETH당 200토큰을 정해줄 상태 변수

    constructor(string memory _name,string memory _symbol, uint _amount){
        owner = msg.sender;
        name = _name;
        symbol = _symbol;
        mint(_amount * (10 ** uint256(decimals)));
    }
    
    receive() external payable{
        require(msg.value != 0);
        uint amount = msg.value * ethCanBuy;

        require(balances[owner] >= amount);
        balances[owner] -= amount;
        balances[msg.sender] += amount;
        if(msg.sender == owner){
            mint(amount);
        }
        emit Transfer(owner,msg.sender,amount);
    }
}

ERC20 토큰을 발행시 변수나 함수명은 이미 정해져 있다.

 

3. 배포

/migrations/2_deployed_SEOKToken.js

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

module.exports = function (deployer) {
  deployer.deploy(SEOKToken, "SEOKToken", "STK", 10000);
};
npx truffle migration

4. 토큰 확인

메타마스크에서 네트워크 설정시 chain ID는 처음 가나쉬를 실행했던 chain ID 7722를 입력해준다.

빌드된 json에서 CA값 찾은후 토큰추가

CA에 이더를 보내면 그 가격만큼 토큰을 받을 수 있다.

728x90
반응형

'개발 > BlockChain' 카테고리의 다른 글

[BlockChain] localhost에서 remix 연동  (0) 2022.12.06
[BlockChain] ERC20 Token - openzeppelin 사용  (1) 2022.12.06
[BlockChain] 사과 판매 앱 만들기  (0) 2022.12.06
[BlockChain] 스마트컨트랙트로 투표 Dapp 만들기  (0) 2022.12.06
[BlockChain] 메타마스크 토큰추가  (1) 2022.12.06
'개발/BlockChain' 카테고리의 다른 글
  • [BlockChain] localhost에서 remix 연동
  • [BlockChain] ERC20 Token - openzeppelin 사용
  • [BlockChain] 사과 판매 앱 만들기
  • [BlockChain] 스마트컨트랙트로 투표 Dapp 만들기
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    30일챌린지
    명령어
    30일 챌린지
    하이퍼레저
    프로그래머스
    React
    컨테이너
    html
    도커
    node.js
    go
    mysql
    go언어
    ERC721
    블록체인
    nodejs
    js
    CSS
    node
    erc20
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[BlockChain] ERC20 Token 만들기
상단으로

티스토리툴바