(openzepplin series is written in korean language, If you want to see the intruductions on English, go to this link: https://docs.openzeppelin.com/contracts/5.x/erc20)

본 문서에서는 오픈제플린이 어떤 방식으로 ERC-20을 구현했는지에 관한 이야기를 주로 나눌 예정입니다.

// contracts/GLDToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract GLDToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("Gold", "GLD") {
        _mint(msg.sender, initialSupply);
    }
}

기본적으로 오픈제플린의 컨트랙트는 상속을 통해서 사용하게 된다. 코드에 보이는 ERC20(”Gold”, “GLD”)는 부모 컨트랙트인 ERC20의 constructor이다. 보통 부모 컨트랙트의 생성자가 먼저 수행되고, 자식 컨트랙트의 생성자가 수행되는 식이다. 여기서 Gold는 토큰의 이름이고, GLD는 토큰의 약자이다.

(아, 토큰의 이름이나 토큰의 심볼이 다른 토큰과 겹칠 수도 있다. 이에 대한 이더리움 체인 자체의 오류는 없다. 궁금하면 굉장히 유명한 토큰…이를테면 PancakeSwap과 CAKE를 각각 이름과 심볼에 넣고 발행해보면 제대로 올라가는 모습을 볼 수 있다. 물론 정신머리 제대로 박힌 프로젝트 빌더들이라면 나중에 바낸이나 코베, FTX…(는 죽었고) 에 상장을 염두에 두기에 이를 수행하지 않을것이며, 이름과 심볼이 겹친다면 이는 스캠코인일 가능성이 짙다. 투자하지도 말고 오해받을 수도 있으니 만들지도 말자.)

decimals

토큰 발행시 항상 고민하는 게 있는데, 바로 소수점 매매이다. 오픈제플린의 erc20컨트랙트의 decimal, 즉 소수점 거래가 가능한 소수점은 18으로, 그대로 발행하면 해당 토큰은 18자리까지 소수점 거래가 가능한 토큰이 된다. 하지만 이렇게 decimal을 크게 늘려버리면 가스비가 증가한다는(사실 진짜 소량이긴 한데 그거 모이면 몇백 나온다 ㅎㅎ;;) 단점이 존재한다.

그렇기에 프로젝트가 터져서 소수점 매매가 얼마나 활발하게 이루어질 것인가 vs 가스비를 얼마나 많이 아낄 것인가 사이에서 저울질한 다음에 결정한 소수점을 ERC20컨트랙트를 오버라이딩해서 재정의하는 방식으로 넣어주면 되는데,

function decimals() public view virtual override returns (uint8) {
  return 16;
}

이런 식으로 넣어주면 된다. (예시의 경우 GLDToken컨트랙트의 코드 안에다가.)

creating supply(총공급량 결정하기)

맨 처음에 토큰을 민팅할 때 얼마나 발행할건지를 정해야 한다. 그때 그때 민팅하는 프로젝트들도 물론 있지만, 프로젝트에서 쓰일 해당 토큰의 가격방어를 위해서는 제한된 수량을 전부 다 발행한 다음에 주기마다 락업을 시키는 게 가장 좋기 때문에 수많은 프로젝트들이 이를 채택중이다. (이건 토크노믹스 쪽으로 빠지는데, 명심하자. 토크노믹스가 개판이면 절대 프로젝트에 들어가지 말아야 한다. 투자했다가 본인이 개발자들 러그풀에 당할 수도 있다. 경험담이다. ㅜㅜㅜㅜ)

contract ERC20FixedSupply is ERC20 {
    constructor() ERC20("Fixed", "FIX") {
        _mint(msg.sender, 1000);
    }
}

아까 GLDToken에서도 봤겠지만, constructor에서 mint함수를 직접 건드려 msg.sender.즉 호출자에게 발행된 토큰 전액을 보낸다. 보통 디파이 프로젝트에서는 CA가 msg.sender가 되는 경우가 많다. 그래야 해당 CA가 가진 토큰을 통해 탈중앙화된 식으로 토크노믹스를 구현할 수 있으니까… 만약 저기에 연결된 계정이 EOA라면? 불법 도박사이트마냥 러그풀 반쯤 확정이다. 축하한다.(ㅜㅜ)

저기 나와있는 _mint라는 함수를 호출할 수만 있다면 토큰을 자의적으로 늘리는 공격이 가능해지니, 유심히 보자.

여기까지는 overview형식으로 간단하게 erc20토큰을 되짚어 본 것이고… 지금부터가 메인이다.