안녕하세요.
오늘은 지난 4월 3일에 진행된 모나드 부트캠프 3일 차 두 번째 내용을 정리 및 복습해 보겠습니다.
3일 차 두 번째 내용 :
- ERC-20 토큰 배포하기
아래 제공한 코드는 기초님께서 작성해 주신 코드를 인용하였습니다.
기초코인수급자
You can view and join @gichocoin right away.
t.me
contracts/파일이름.sol 생성
아래 코드는 openzeppelin 사이트에서 원하는 항목을 체크하여 쉽게 만들 수 있습니다.
https://wizard.openzeppelin.com/#erc20&name=MyToken&symbol=MTK
OpenZeppelin Contracts Wizard
An interactive smart contract generator based on OpenZeppelin Contracts.
wizard.openzeppelin.com
// SPDX-License-Identifier: MIT
// 사용 허가 라이선스를 명시. MIT는 가장 일반적인 오픈소스 라이선스 중 하나입니다.
// Compatible with OpenZeppelin Contracts ^5.0.0
// 이 코드는 OpenZeppelin의 5.0.0 버전 이상에서 사용 가능함을 알림
pragma solidity ^0.8.22;
// 이 스마트 계약은 Solidity 0.8.22 버전을 사용하여 작성됨
// 필요한 OpenZeppelin 라이브러리들 import
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
// ERC20 토큰 기본 기능 제공 (이름, 심볼, 전송 등)
import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
// 서명 기반 토큰 전송을 가능하게 해주는 Permit 기능 (EIP-2612)
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
// 소유자(owner)를 설정하고, 특정 기능을 오직 소유자만 실행할 수 있게 해주는 모듈
// AEJ 토큰 스마트 계약 선언
contract AEJ is ERC20, Ownable, ERC20Permit {
// 생성자(constructor): 계약이 배포될 때 실행됨
constructor(address recipient, address initialOwner)
ERC20("AEJ", "AEJ") // 토큰 이름과 심볼 설정
Ownable(initialOwner) // 소유자 주소 설정
ERC20Permit("AEJ") // Permit 기능 사용을 위한 이름 설정
{
_mint(recipient, 20010119 * 10 ** decimals());
// recipient 주소에 20,010,119개의 AEJ 토큰을 발행 (decimals()는 기본적으로 18자리)
}
// mint 함수: 소유자만 실행 가능, 원하는 주소에 원하는 수량만큼 토큰을 추가 발행할 수 있음
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
위 코드를 요약하자면
- AEJ라는 이름과 심볼을 가진 ERC20 토큰
- 배포 시 특정 수량을 지정한 주소에 미리 발행하고
- 추가 발행은 소유자만 할 수 있으며
- ERC20 Permit 기능을 통해 서명 기반 토큰 전송(approve 없이 전송)이 가능한 구조
위 코드를 복사해서 두 개의 sol 파일을 만들겠습니다.
scripts/deployToken.js 생성
토큰을 Monad 테스트넷에 배포하는 전체 과정을 자동화하며,
배포자 주소를 constructor에 두 번 넣어서 초기 발행 대상 + 소유자를 모두 설정합니다.
const { ethers } = require("ethers"); // ethers.js 라이브러리를 불러옴 (이더리움과 상호작용할 수 있도록 함)
const hre = require("hardhat"); // Hardhat 환경 객체를 불러옴
async function main() {
await hre.run("compile"); // 스마트 계약을 컴파일 (최신 상태 유지)
const artifact = await hre.artifacts.readArtifact("AEJ"); // AEJ 계약의 ABI와 바이트코드를 읽음
const abi = artifact.abi; // ABI (함수, 이벤트 인터페이스)
const bytecode = artifact.bytecode; // Bytecode (EVM이 실행할 실제 코드)
// Monad 테스트넷의 JSON-RPC 프로바이더 설정
const provider = new ethers.JsonRpcProvider("https://testnet-rpc.monad.xyz");
// 지갑 객체 생성: Private Key를 이용해서 서명 가능한 지갑 생성
const wallet = new ethers.Wallet(
process.env.PRIVATE_KEY_1, // .env 파일 또는 개인키 사용 (예: 혹은 그냥 이 위치에 "지갑 Private key" 입력)
provider // 위에서 만든 provider로 연결
);
// 지갑 주소의 잔액 확인
const balance = await provider.getBalance(wallet.address);
const deployer = wallet.address; // 배포자의 주소 저장
// 배포자 주소와 잔액 로그 출력
console.log(
"현재 이 주소로 트랜잭션을 만들겁니다. 당신의 잔고는 다음과 같습니다.",
deployer,
balance
);
// 계약 배포를 위한 ContractFactory 생성 (ABI, Bytecode, 지갑)
const contractFactory = new ethers.ContractFactory(abi, bytecode, wallet);
console.log("배포중입니다");
// 스마트 계약 배포 (constructor에 2개의 주소 인자 전달: recipient, initialOwner)
const contract = await contractFactory.deploy(deployer, deployer);
// 배포 트랜잭션 해시 출력 (탐색기에서 확인 가능)
console.log(
"익스플로러에 검사해야하는 해시입니다",
contract.deploymentTransaction().hash
);
// 배포된 계약 주소 출력
console.log("배포된 주소는 다음과 같습니다", contract.target);
// 트랜잭션이 블록에 포함될 때까지 대기
console.log("트랜잭션이 완료될 때까지 기다리는 중...");
await contract.deploymentTransaction().wait();
// 배포자 주소의 AEJ 토큰 잔액 확인 (premint된 수량)
console.log(
"현재 premint한 값은 다음과 같습니다",
await contract.balanceOf(deployer)
);
}
// 위의 main 함수를 실행하고, 에러가 나면 catch 블록에서 처리함
main()
.then(() => process.exit(0)) // 정상 종료
.catch((error) => {
console.error(error); // 에러 출력
process.exit(1); // 에러 종료
});
터미널에 명령어를 실행햅니다.
OpenZeppelin 라이브러리 설치 → Hardhat 스크립트를 Monad 네트워크에 배포하는 순서
npm install @openzeppelin/contracts
npx hardhat run scripts/token/deployToken.js --network monad
아래와 같은 결과를 확인할 수 있습니다.
Hash : 0x225360888f377a9db95f15da6a3d28c10b3d8bb337fc57199fdd2ab89ad1656b
배포된 주소(CA) : 0xC0703Dac2aC0B2fbc9F270718C8A7e729F3772b5
모나드 익스플로어에 CA를 검색하면 배포된 토큰을 확인할 수 있습니다.
https://testnet.monadexplorer.com/token/0xC0703Dac2aC0B2fbc9F270718C8A7e729F3772b5
MonadExplorer | Monad Explorer
MonadExplorer is Layer 1 Monad blockchain explorer, where you can explore transactions, blocks, accounts, tokens and dive into immersive Monad data visualization through Block Explorer, Token Data Analysis, Statistics tools.
testnet.monadexplorer.com
메타마스크 지갑에서 토큰 추가를 누른 뒤 CA를 입력하면 배포한 토큰을 지갑으로 가져올 수 있습니다.
이상으로 복습을 마치도록 하겠습니다.
'블록체인 실습' 카테고리의 다른 글
모나드 빌더 부트캠프 - Phase 1 - 4일차 정리 (1) | 2025.04.15 |
---|---|
모나드 빌더 부트캠프 - Phase 1 - 3일차 정리 (0) | 2025.04.13 |
모나드 빌더 부트캠프 - Phase 1 - 2일차 정리 (2) | 2025.04.07 |
모나드 빌더 부트캠프 - Phase 1 - 1일차 정리 (0) | 2025.04.04 |
빗썸 예측차트 서비스 분석 및 실제 사용 후기 (1) | 2025.01.31 |