# 노드 설치가 안되어 있으면 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))