상세 컨텐츠

본문 제목

ERC-20 토큰(나만의 토큰 만들기 실습)

Programming Language/Solidity

by Yongari 2023. 2. 13. 22:39

본문

 

ERC-20(Ethereum Request for Comment20)

 

ERC-20은 Ethereum Request for Comment20의 약자를 뜻하며 ERC 제안서의 일련번호다. 

ERC-20은 이더리움 블록체인 네트워크에서 정한 표준 토큰 스펙으로 EIPs에서 관리하는 공식 프로토콜이다. 

이더리움 호환에 필요한 모든 요구사항을 충족시키는 표준은 ERC-20으로 간주한다.

ERC-20 토큰은 이더리움과 교환할 수 있고 이더리움 지갑으로 전송이 가능하다.

 

ERC20에 대한 표준 문서 링크

 

ERC-20: Token Standard

 

eips.ethereum.org

 

환경 설정 

 

Ganache 환경설정 

 

1. 다음 링크에서 환경에 맞게 다운로드를 해줍니다. 

https://trufflesuite.com/ganache/ 

 

Ganache - Truffle Suite

Features VISUAL MNEMONIC & ACCOUNT INFO Quickly see the current status of all accounts, including their addresses, private keys, transactions and balances.

trufflesuite.com

 

2. 설치가 완료되면 다음과 같이 가나슈 GUI 창을 확인한 뒤 첫 번째 Address에서 맨 오른쪽 키? 모양 버튼을 클릭합니다.

3. 다음과 같은 창이 출력되면 PRIVATE KEY 하단에 키값을 복사합니다. ADDRESS가 아닌 PRIVATEKEY입니다. 

 

 

4. MetaMask를 설치해주세요. (설치가 이미 되어있으신 분들은 pass)

(설치가 안되신 분들은 다음 링크를 통해 설치해주세요. ) 

크롭 웹스토어에 MetaMask 검색하시면 됩니다.

 

 

5. Ganache 네트워크 추가 

이름은 자유롭게 해주시면 되고 RPC URL과 체인 ID , ETH는 사진과 같이 설정해주시면 됩니다. 

 

6. 이후 MetaMask에서 다음과 같이 오른쪽 상단 버튼을 클릭한 후 계정 가져오기를 합니다.

7. 3번에서 복사한 PRIVATE KEY를 비밀키 부분에 복사붙여 넣기하면 가나슈 네트워크의 계정을 가져올 수 있습니다.

 

8. 다음과 같이 https://remix.ethereum.org/ 사이트에 접속하신 후에 왼쪽 네 번째 버튼을 클릭하시고 
위에 설정한 MetaMask와 연동합니다. 

 

 

 

IERC20

 

다음 코드는 ERC20의 인터페이스인 IERC20 코드다.

ERC20은 다음 기능을 가지고 있다.

1. 토큰 전송

2. 다른 사람이 토큰 보유자를 대신하여 토큰을 전송할 수 있도록 허용하는 기능 

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

// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.0/contracts/token/ERC20/IERC20.sol
interface IERC20 {

    // internal: internal은 스마트 컨트랙트의 interface로 비공개한다는 것입니다. 계약서(Contract)의 해당 내용을 비공개한다는 의미이며, 계약서의 내부에서만 사용하는 함수라는 것을 표시합니다. 상태변수(state variable)는 internal이 기본값입니다. 함수나 상태 변수에 접근 제어자를 쓰지 않고 비워둔다면 internal로 설정됩니다. 계약서 자신과 상속받은 계약서만 사용할 수 있습니다.
    // external: external은 스마트 컨트랙트의 interface로 공개한다는 것입니다. 계약서(Contract)의 해당 내용을 공개한다는 의미이며, 계약서의 외부에서 사용하는 함수라는 것을 표시합니다. 상태변수(state variable)는 external일 수 없습니다. 계약서 내부에서 사용할 경우 this를 사용해서 접근해야 합니다.
    // public: 공개 함수입니다. 공개 기능은 계약 인터페이스의 일부이며 내부적으로 또는 메시지를 통해 호출할 수 있습니다. 공개 상태 변수의 경우 자동 getter 함수가 생성됩니다.
    // private: 비공개 함수입니다. 비공개함수는 계약서 내부에서도 자신만 사용하는 함수라는 것을 표시합니다. 상태변수와 함수 모두 파생된 계약이 아닌 정의된 계약에서만 볼 수 있습니다
    // pure: storage에서 변수를 읽어오거나 쓰지 않는 함수임을 명시합니다.
    // constant, view : 상태를 변경하지 않는 함수임을 명시합니다.
    // payable: 입금을 받을 수 있는 함수임을 명시합니다..
    
    //현재 존재하는 이 토큰의 전체 개수를 리턴한다. 
    function totalSupply() external view returns (uint); 

    //주소가 주어지면 해당 주소의 토큰 잔액을 반환한다. 
    function balanceOf(address account) external view returns (uint);

    //주소와 금액이 주어지면 해당 주소로 토큰의 양을 전송한다. 
    //전송을 실행하는 주소의 잔액에서 전송을 실행한다. 
    function transfer(address recipient, uint amount) external returns (bool);

    //소유자 주소와 지출자(spender) 주소가 주어지면 지출자가 출금할 수 있도록 소유자가 승인한 잔액을 리턴한다. 
    function allowance(address owner, address spender) external view returns (uint);

    //수취인 주소와 금액이 주어지면 그 주소가 승인을 한 계정에서 최대 금액까지 여러 번 송금할 수 있도록 승인한다. 
    function approve(address spender, uint amount) external returns (bool);

    //보낸 사람, 받는 사람 및 금액이 주어지면 한 계정에서 다른 계정으로 토큰을 전송한다. 
    //approve와 함께 조합해서 사용한다. 
    function transferFrom(
        address sender,
        address recipient,
        uint amount 
    )external returns (bool);

    //전송이 성공하면(transfer or transferFrom 호출) 이벤트가 트리거된다. 0 값 전송의 경우에도 마찬가지
    //토큰이 이동할때마다 로그를 남긴다. 
    event Transfer(address indexed from, address indexed to, uint value);
    //approve 함수가 실행되면 로그를 남긴다. 
    //approve를 성공적으로 호출하면 이벤트가 기록된다. 
    event Approval(address indexed owner, address indexed spender, uint value)
}

 

ERC20 

IERC20을 상속한 뒤 함수별로 기능을 정리해봤다.

totalSupply : ERC-20 토큰의 총 발행량 확인

balanceOf : owner가 가지고 있는 토큰 보유량 확인

transfer : 토큰을 전송 (A에서 B로)

approve : spender에 value만큼의 토큰을 인출한 권리를 부여함 이 때 반드시 Approval 이벤트 함수를 호출해야함

Approval : approve 함수가 실행되면 로그를 남기고 성공적으로 호출하면 이벤트가 기록된다. 
allowance : owner가 pender에 양도 설정한 토큰양을 확인

transferFrom : spender가 거래할 수 있게 양도받은 토큰을 전송함

 

토큰을 전송하는 방법은 2가지가 있음

 

1. transfer : sender가 recipient에게 전송하는 기능

2. approve -> allowance -> transferFrom : approve를 통해 msg.sender(계약 생성자)가 spender에게 value만큼 토큰을 인출할 권리를 부여하고 Approval 이벤트를 호출한다.  allowance를 통해 msg.sender가 spender에 양도 설정한 토큰의 양을 확인하고 

transferFrom을 통해 spender가 recipient에게 양도받은 토큰을 전송함 

(혹시 제가 틀린 부분이 있으면 댓글로 알려주시면 감사하겠습니다. 제가 이해한대로 설명을 적어봤습니다.)

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

import "./IERC20.sol";

contract ERC20 is IERC20 {
    //총 공급량 변수 선언 
    uint public totalSupply;
    //소유자별로 토큰 잔액을 내부 테이블로 구현한다. 
    //이러면 토큰 컨트랙트에서 토큰을 소유한 사람을 추적할 수 있다. 
    mapping(address => uint) public balanceOf;
    //허용량의 데이터 매핑이다. 
    // ERC20 토큰을 사용하면 토큰 소유자가 권한을 위임자에게 위임하여 소유자의 잔액에서 특정 금액을 지출할 수 있다.  
    // ERC20 컨트랙트는 기본 키가 토큰 소유자의 주소고 지출자 주소와 허용 한도에 매핑되는 2차원 매핑으로 허용량을 추적한다. 
    mapping(address => mapping(address => uint)) public allowance;
    // 사람이 읽을 수 있는 토큰 
    string public name = "Yongari";
    //사람이 읽을 수 있는 기호 
    string public symbol = "YongTT";
    //토큰 양을 나눌 수 있는 소수 자릿수 반환 
    uint8 public decimals = 18;

    //출금 함수 
    function transfer(address recipient, uint amount) external returns (bool) {
        balanceOf[msg.sender] -= amount;
        balanceOf[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }

    //approve 후 transferFrom을 사용하는 트랜잭션 워크플로우 
    //토큰 소유자가 제어를 다른 주소에 위임할 수 있게 해준다. 이것은 제어를 토큰 배포 컨트랙트에 위임하는데 
    //가장 많이 사용되지만 거래소에서도 많이 사용된다. 
    function approve(address spender, uint amount) external returns (bool) {
        allowance[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    //approve 후 transferFrom을 사용하는 트랜잭션 워크플로우 
    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external returns (bool) {
        allowance[sender][msg.sender] -= amount;
        balanceOf[sender] -= amount;
        balanceOf[recipient] += amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    //새 토큰을 만드는 함수 
    //ERC20 표준함수는 아니지만 많은 경우에 볼 수 있음
    function mint(uint amount) external {
        balanceOf[msg.sender] += amount;
        totalSupply += amount;
        emit Transfer(address(0), msg.sender, amount);
    }

    //토큰을 소각하는 함수 
    //ERC20 표준함수는 아니지만 많은 경우에 볼 수 있음
    function burn(uint amount) external {
        balanceOf[msg.sender] -= amount;
        totalSupply -= amount;
        emit Transfer(msg.sender, address(0), amount);
    }
}

 

이후 ganache 또는 truffle 또는 테스트 네트워크를 이용해서 다음과 같이  리믹스에서 테스트할 수 있습니다.

1. solidity 코드를 compile한다. 

2. Test Network를 선택하고 Deploy(배포)한다. 

그러면 다음 스크린샷과 같은 결과를 받을 수 있습니다. 

 

토큰이름 : Yongari

토큰심볼 : YongTT(Yong Test Token)

balanceOf(잔액) : 210000000

 

0. https://remix.ethereum.org/  에 폴더를 만든 뒤 폴더 하단에 IERC20.sol과 ERC20.sol을 코딩을 해줍니다. (상기 코드 참조) 

 

1. 왼쪽 세번째 버튼을 누르면 Compile을 실행시켜서 코드에 문제가 없는지 체크합니다.

 

 

2. ENVIRONMENT를 설정하고  ACCOUNT를 설정한 뒤 Deploy하면 다음과 같이 컨트랙트를 배포할 수 있습니다. 

 

Transaction을 저장한 json 파일

더보기
{
  "accounts": {
    "account{0}": "0x09B225298c2C9F8428c198068588d10B677d1A08"
  },
  "linkReferences": {},
  "transactions": [
    {
      "timestamp": 1676293504467,
      "record": {
        "value": "0",
        "inputs": "()",
        "parameters": [],
        "name": "",
        "type": "constructor",
        "abi": "0xf0152c6345fcb601d64a43d04fc67b688fa67a2d5a2c515c760055c79ef98a81",
        "contractName": "ERC20",
        "bytecode": "60806040526040518060400160405280600781526020017f596f6e6761726900000000000000000000000000000000000000000000000000815250600390816200004a91906200033c565b506040518060400160405280600681526020017f596f6e6754540000000000000000000000000000000000000000000000000000815250600490816200009191906200033c565b506012600560006101000a81548160ff021916908360ff160217905550348015620000bb57600080fd5b5062000423565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200014457607f821691505b6020821081036200015a5762000159620000fc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000185565b620001d0868362000185565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200021d620002176200021184620001e8565b620001f2565b620001e8565b9050919050565b6000819050919050565b6200023983620001fc565b62000251620002488262000224565b84845462000192565b825550505050565b600090565b6200026862000259565b620002758184846200022e565b505050565b5b818110156200029d57620002916000826200025e565b6001810190506200027b565b5050565b601f821115620002ec57620002b68162000160565b620002c18462000175565b81016020851015620002d1578190505b620002e9620002e08562000175565b8301826200027a565b50505b505050565b600082821c905092915050565b60006200031160001984600802620002f1565b1980831691505092915050565b60006200032c8383620002fe565b9150826002028217905092915050565b6200034782620000c2565b67ffffffffffffffff811115620003635762000362620000cd565b5b6200036f82546200012b565b6200037c828285620002a1565b600060209050601f831160018114620003b457600084156200039f578287015190505b620003ab85826200031e565b8655506200041b565b601f198416620003c48662000160565b60005b82811015620003ee57848901518255600182019150602085019450602081019050620003c7565b868310156200040e57848901516200040a601f891682620002fe565b8355505b6001600288020188555050505b505050505050565b610d6a80620004336000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806342966c681161007157806342966c681461016857806370a082311461018457806395d89b41146101b4578063a0712d68146101d2578063a9059cbb146101ee578063dd62ed3e1461021e576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b661024e565b6040516100c391906109be565b60405180910390f35b6100e660048036038101906100e19190610a79565b6102dc565b6040516100f39190610ad4565b60405180910390f35b6101046103ce565b6040516101119190610afe565b60405180910390f35b610134600480360381019061012f9190610b19565b6103d4565b6040516101419190610ad4565b60405180910390f35b610152610585565b60405161015f9190610b88565b60405180910390f35b610182600480360381019061017d9190610ba3565b610598565b005b61019e60048036038101906101999190610bd0565b61066f565b6040516101ab9190610afe565b60405180910390f35b6101bc610687565b6040516101c991906109be565b60405180910390f35b6101ec60048036038101906101e79190610ba3565b610715565b005b61020860048036038101906102039190610a79565b6107ec565b6040516102159190610ad4565b60405180910390f35b61023860048036038101906102339190610bfd565b610909565b6040516102459190610afe565b60405180910390f35b6003805461025b90610c6c565b80601f016020809104026020016040519081016040528092919081815260200182805461028790610c6c565b80156102d45780601f106102a9576101008083540402835291602001916102d4565b820191906000526020600020905b8154815290600101906020018083116102b757829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516103bc9190610afe565b60405180910390a36001905092915050565b60005481565b600081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546104629190610ccc565b9250508190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546104b89190610ccc565b9250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461050e9190610d00565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516105729190610afe565b60405180910390a3600190509392505050565b600560009054906101000a900460ff1681565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105e79190610ccc565b92505081905550806000808282546105ff9190610ccc565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106649190610afe565b60405180910390a350565b60016020528060005260406000206000915090505481565b6004805461069490610c6c565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090610c6c565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b505050505081565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107649190610d00565b925050819055508060008082825461077c9190610d00565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107e19190610afe565b60405180910390a350565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461083d9190610ccc565b9250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546108939190610d00565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108f79190610afe565b60405180910390a36001905092915050565b6002602052816000526040600020602052806000526040600020600091509150505481565b600081519050919050565b600082825260208201905092915050565b60005b8381101561096857808201518184015260208101905061094d565b60008484015250505050565b6000601f19601f8301169050919050565b60006109908261092e565b61099a8185610939565b93506109aa81856020860161094a565b6109b381610974565b840191505092915050565b600060208201905081810360008301526109d88184610985565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a10826109e5565b9050919050565b610a2081610a05565b8114610a2b57600080fd5b50565b600081359050610a3d81610a17565b92915050565b6000819050919050565b610a5681610a43565b8114610a6157600080fd5b50565b600081359050610a7381610a4d565b92915050565b60008060408385031215610a9057610a8f6109e0565b5b6000610a9e85828601610a2e565b9250506020610aaf85828601610a64565b9150509250929050565b60008115159050919050565b610ace81610ab9565b82525050565b6000602082019050610ae96000830184610ac5565b92915050565b610af881610a43565b82525050565b6000602082019050610b136000830184610aef565b92915050565b600080600060608486031215610b3257610b316109e0565b5b6000610b4086828701610a2e565b9350506020610b5186828701610a2e565b9250506040610b6286828701610a64565b9150509250925092565b600060ff82169050919050565b610b8281610b6c565b82525050565b6000602082019050610b9d6000830184610b79565b92915050565b600060208284031215610bb957610bb86109e0565b5b6000610bc784828501610a64565b91505092915050565b600060208284031215610be657610be56109e0565b5b6000610bf484828501610a2e565b91505092915050565b60008060408385031215610c1457610c136109e0565b5b6000610c2285828601610a2e565b9250506020610c3385828601610a2e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610c8457607f821691505b602082108103610c9757610c96610c3d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610cd782610a43565b9150610ce283610a43565b9250828203905081811115610cfa57610cf9610c9d565b5b92915050565b6000610d0b82610a43565b9150610d1683610a43565b9250828201905080821115610d2e57610d2d610c9d565b5b9291505056fea26469706673582212204d64e51c8b434bd3a20c23a19b96cc1d77a02ed0876d8021ba217abf594805bb64736f6c63430008110033",
        "linkReferences": {},
        "from": "account{0}"
      }
    },
    {
      "timestamp": 1676293625593,
      "record": {
        "value": "0",
        "inputs": "(uint256)",
        "parameters": [
          "10000000"
        ],
        "name": "mint",
        "type": "function",
        "to": "created{1676293504467}",
        "abi": "0xf0152c6345fcb601d64a43d04fc67b688fa67a2d5a2c515c760055c79ef98a81",
        "from": "account{0}"
      }
    },
    {
      "timestamp": 1676294117826,
      "record": {
        "value": "0",
        "inputs": "(uint256)",
        "parameters": [
          "200000000"
        ],
        "name": "mint",
        "type": "function",
        "to": "created{1676293504467}",
        "abi": "0xf0152c6345fcb601d64a43d04fc67b688fa67a2d5a2c515c760055c79ef98a81",
        "from": "account{0}"
      }
    }
  ],
  "abis": {
    "0xf0152c6345fcb601d64a43d04fc67b688fa67a2d5a2c515c760055c79ef98a81": [
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "owner",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "spender",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "value",
            "type": "uint256"
          }
        ],
        "name": "Approval",
        "type": "event"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "spender",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "approve",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "burn",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "mint",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "transfer",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "from",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "to",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "value",
            "type": "uint256"
          }
        ],
        "name": "Transfer",
        "type": "event"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "sender",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "transferFrom",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "allowance",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "name": "balanceOf",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "decimals",
        "outputs": [
          {
            "internalType": "uint8",
            "name": "",
            "type": "uint8"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "name",
        "outputs": [
          {
            "internalType": "string",
            "name": "",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "symbol",
        "outputs": [
          {
            "internalType": "string",
            "name": "",
            "type": "string"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "totalSupply",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      }
    ]
  }
}

 

관련글 더보기