본문 바로가기
IT/JavaScript(TypeScript)

Stable Coin 발행 실습 with Hardhat

by 가능성1g 2025. 9. 22.
반응형

 

# 노드 설치가 안되어 있으면 nvm 으로 설치해서 node 부터 설치한다. 

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 시스템 재접속 후 실행
nvm install --lts

현재 기준 v22.19.0 가 설치됨

 

# 스테이블 코인 작업 폴더 설정 및 hardhat 프로젝트 생성

mkdir my-stablecoin
cd my-stablecoin
npm init -y

# 버전 미지정시 의존성 오류 발생함..
npm install --save-dev hardhat@^2.22.0 @nomicfoundation/hardhat-toolbox@^5.0.0

# TypeScript 프로젝트로 선택하고 현재 폴더를 프로젝트로 선택 진행한다. 

npx hardhat init

####### 다시할때는 아래와같이 실행하고 다시 설치
rm -rf node_modules package-lock.json

# 계약 생성을 위한 패키지 추가 설치
npm install @openzeppelin/contracts

# contracts/MyStaablecoin.sol 생성
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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

// ERC20(토큰 표준)과 Ownable(소유권) 기능을 가져와서 사용합니다.
contract MyStablecoin is ERC20, Ownable {

    // 스마트 계약이 처음 만들어질 때 단 한번만 실행되는 부분입니다.
    // 토큰의 이름, 심볼(단위), 그리고 최초의 소유자를 정합니다.
    constructor(address initialOwner) ERC20("My Stablecoin", "MSC") Ownable(initialOwner) {}

    /**
     * @dev 코인을 새로 발행(mint)하는 함수입니다.
     * 오직 이 계약의 소유자(owner)만 실행할 수 있습니다.
     */
    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    /**
     * @dev 사용자가 자신의 코인을 소각(burn)하는 함수입니다.
     * 누구나 자신의 토큰은 직접 소각할 수 있습니다.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }
}

# 컴파일
npx hardhat compile

# 배포 스크립트 작성
scripts/deploy.ts
import { ethers } from "hardhat";

async function main() {
  // 배포를 실행할 계정(주소)를 가져옵니다. 보통 첫 번째 계정이 배포자가 됩니다.
  const [deployer] = await ethers.getSigners();
  console.log("Deploying contracts with the account:", deployer.address);

  // MyStablecoin 계약을 배포 준비합니다.
  const myStablecoinFactory = await ethers.getContractFactory("MyStablecoin");
  
  // 배포를 실행하면서 constructor에 deployer의 주소를 넘겨줍니다.
  // 이렇게 하면 배포자가 바로 '소유자(owner)'가 됩니다.
  const myStablecoin = await myStablecoinFactory.deploy(deployer.address);

  // 배포가 완료될 때까지 기다립니다.
  await myStablecoin.waitForDeployment();
  
  const contractAddress = await myStablecoin.getAddress();
  console.log(`MyStablecoin deployed to: ${contractAddress}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

# 노드 실행
npx hardhat node
# 스크립트 배포
npx hardhat run scripts/deploy.ts --network localhost

# 계약 실행
npx hardhat console --network localhost

const MyStablecoin = await ethers.getContractFactory("MyStablecoin")
const stablecoin = await MyStablecoin.attach("여기에_계약_주소_붙여넣기")

const stablecoin = await MyStablecoin.attach("0x5FbDB2315678afecb367f032d93F642f64180aa3")

 

# 아래 예제들은 개발 노드 실행시 나오는 주소를 이용하면 된다!
## 발행 mint
await stablecoin.mint("소유자_계정_주소", ethers.parseUnits("100", 18))

## 발행 확인
ethers.formatUnits(await stablecoin.balanceOf("소유자_계정_주소"), 18)

## 송금
await stablecoin.transfer("받는사람_계정_주소", ethers.parseUnits("10", 18))

## 잔액 확인
ethers.formatUnits(await stablecoin.balanceOf("소유자_계정_주소"), 18)
ethers.formatUnits(await stablecoin.balanceOf("받는사람_계정_주소"), 18)

## 가지고 있는 코인 소각
await stablecoin.burn(ethers.parseUnits("20", 18))

반응형