5-1. 토탈/개인 토큰 개수 파악하기

동동주·2025년 10월 10일


1. Mytoken에 총 토큰/개인 토큰 파악 기능 더해보기
2. 테스트 해보기

1. 토큰 잔고 파악 기능 추가

코드1-1.

이전 코드에다가
토큰 총 발행 개수와, 소유자-토큰 개수를 map타입으로 지정.. (?)

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

contract MyToken {
    string public name;
    string public symbol;
    uint8 public decimals;

    //토큰의 총 발행 개수
    uint256 public totalSupply;

    //누가 얼마나 가지고 있는지
    mapping(address => uint256) public balanceOf;
    // (key => value)

    constructor(string memory _name, string memory _symbol, uint8 _decimals) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
    }

    // external : 외부 호출만 가능하다 (public이랑 좀 다름)
    // returns : 리턴 '타입' 지정. 여러 개 반환 가능해서 -s가 붙음 (<-> return)

+@.
map타입에 대해서는 따로 더 알아볼 예정 (typescript, javascript..등에서 사용) 추후첨부예정
(solidity에서는 mapping이라고 사용)

터미널1-1.

❯ nvm use v20.11.0                                             
Now using node v20.11.0 (npm v10.2.4)
(터미널 다시 켜서.. 다시 설정해줌...)

❯ npx hardhat compile                                         
Generating typings for: 1 artifacts in dir: typechain-types for target: ethers-v6
Successfully generated 6 typings!
Compiled 1 Solidity file successfully (evm target: paris).

코드1-1. +@

이 때
contract의 public state는 기본으로 getter함수가 만들어진다.

아래 코드는 이미 있는 getter함수니까 (public으로 선언한 것들이기 때문에) 만들어줄 필요가 없지만, 함수 문법을 보는 목적으로 알려주셔서 적어놨다.

만약 주석이 아닌 경우로 이 코드가 있는 경우?
-> Identifier already declared 에러가 난다...(고 하심)

function totalSupply() external view returns (uint256) {
       return totalSupply;
    }
    
function balanceOf(address owner) external view returns (uint256) {
       return balanceOf[owner];
    }
    
    
// string을 파라미터로 받거나 return으로 줄 때도 memory가 필요하다~
    function name() external view returns (string memory) {
       return name;
    }    
  • address 타입은 일반 프로그래밍언어에 없지만 solidity에서는 자주 필요해서 타입으로 지정해두었고, 20byte로 길이가 지정되어 있다고 한다.



2. 테스트

코드 2-1.

추가한 두 항목에 대한 테스트를 동일한 형식으로 추가해줌.

import hre from "hardhat";
import { expect } from "chai";
import { MyToken } from "../typechain-types";
import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers";
// hardhat에서 컴파일 할 때 필요한 타입 정의 파일을 여기에 보관함

describe("mytoken deploy", () => {
  let myTokenC: MyToken;
  let signers: HardhatEthersSigner[];

  // before > describe, let myTokenC > myTokenC 사용ok
  before("should deploy", async () => {
    signers = await hre.ethers.getSigners();
    myTokenC = await hre.ethers.deployContract("MyToken", [
      "MyToken",
      "MT",
      18,
    ]);
  });

  it("should return name", async () => {
    expect(await myTokenC.name()).equal("MyToken");
  });
  it("should return symbol", async () => {
    expect(await myTokenC.symbol()).equal("MT");
  });
  it("should return decimals", async () => {
    expect(await myTokenC.decimals()).equal(18);
  });
  it("should retrun 0 totalSupply", async () => {
    expect(await myTokenC.totalSupply()).equal(0);
  });
 
  it("should retrun 0 balance for signer 0", async () => {
    expect(await myTokenC.balanceOf(signers[0].address)).equal(0);
    // 위의 코드만으로도 충분하지만,
    // 이렇게도 작성 가능하다!
    const signer0 = signers[0];
    expect(await myTokenC.balanceOf(signer0)).equal(0);
  });
  
});

const....? <- 추후첨부예정?

터미널 2-1.

잘나온다

❯ npx hardhat test                                             

  mytoken deploy
    ✔ should return name (61ms)
    ✔ should return symbol (45ms)
    ✔ should return decimals
    ✔ should retrun 0 totalSupply
    ✔ should retrun 0 balance for signer 0

  5 passing (3s)
profile
배운 내용 정리&기록, 스크랩

0개의 댓글