회원가입, 지갑 연결, 네트워크 설정, 팀 생성, 프로젝트 생성 (1~5단계)는 ERC-20 토큰 발행 실습과 동일하므로 해당 페이지를 참조하면 된다. (https://coincraft.kr/erc-20-ft-minting-test/)
팀 생성, 프로젝트 생성 단계는 ERC-20 토큰 발행 실습 시 생성했던 것을 그대로 사용해도 되고, 새롭게 다시 생성해도 된다.
이번 페이지에서는 프로젝트가 생성된 직후 과정부터 시작한다.
6단계: NFT 발행 메뉴 선택
1. 프로젝트 화면 좌측 메뉴에서 Contracts 항목을 클릭한다.

2. Contracts 페이지에서 우측 상단의 Deploy Contract 버튼을 클릭한다.

3. 두 가지 항목 중 “Launch NFT Collection”을 선택한다.

4. “Select a Project” 팝업 창이 나타나면 앞서 만든 프로젝트명을 선택한다.
5. 이제 NFT 컬렉션 기본 정보 입력 창이 열린다.
7단계: NFT 컬렉션 기본 정보 입력

1. 컬렉션의 이미지를 지정한다. 여기서 지정하는 이미지는 ‘선택사항’이며 Token의 포장지에 불과하다. NFT로 만들어질 이미지 지정은 다음 7단계에서 지정한다.
2. Name(컬렉션 이름): 원하는 이름을 입력한다. 예: My NFT Collection
3. Symbol(심볼): NFT의 Symbol은 선택 사항이다. 입력하지 않아도 된다.
4. 그 외의 값들(Description, Social URLs 등은 필수 값이 아니므로 Skip해도 된다. 하지만 완벽한 NFT컬렉션 만들기 테스트를 해보고 싶다면 모두 입력해 보는 것이 좋다.
5. Admin에는 기본 값으로 내 메타마스크 지갑의 주소가 적혀 있다. 생성된 NFT에 대한 소유권을 지정하는 곳이다. NFT 생성 과정이 모두 완료된 이후 ‘Claim’으로 내 지갑으로 NFT를 가져올 수 있다.
6. 필수 입력 사항들을 모두 입력했다면, 하단의 Next 버튼을 클릭한다.
8단계: NFT 개별 정보 입력

1. “Create Single”과 “Create Multiple” 두 가지 옵션이 나온다.
- Single: 하나의 NFT를 개별로 발행하는 방식
- Multiple: 여러 개를 한 번에 발행하는 방식
이번 실습에서는 초급자를 위해 “Single”을 선택한다.
2. 업로드할 파일을 선택한다. 이미지를 많이 사용하지만, 오디오·비디오·문서 파일도 가능하다. (단, 용량 제한은 있으므로 실습에서는 작은 파일을 사용하는 것이 좋다.)
3. Attributes(속성)를 입력할 수 있다. 이는 OpenSea와 같은 마켓플레이스에서 검색될 때 쓰이는 값이다. 예: Species:Cat → 검색 시 Cat 항목으로 분류된다.
4. 가격(Price)과 발행 수량(Supply)을 입력한다.
5. Background Color와 External URL은 표시 옵션이다. 필요에 따라 입력하거나 비워 두어도 된다.
6. 필수 입력 사항들을 모두 입력했다면, 하단의 Next 버튼을 클릭한다.
9단계: 판매와 수익 분배 설정 (Sales and Fees)

1. Primary Sales(1차 판매 수익): NFT를 처음 판매할 때 발생하는 수익으로, 기본값은 본인의 지갑 주소로 설정된다.
- 예: NFT를 0.05 ETH에 판매 → 0.05 ETH 전부 내 지갑으로 입금
2. Royalties(2차 거래 수수료): NFT가 다른 사람에게 되팔릴 때 창작자에게 돌아오는 수익이다. 이것도 기본값은 본인의 지갑 주소로 설정된다.
- 예: 로열티 5% 설정 시, NFT가 10 ETH에 재 판매되면 0.5 ETH가 내 지갑으로 들어온다.
3. 실습에서는 Primary Sales는 기본값을 그대로 두고, Royalties를 5% 정도로 설정해 보자.
4. 모든 입력을 마친 후 Next 버튼을 클릭한다.
5. 요약 정보 화면에서 내용을 확인한 뒤 “Launch NFT Collection” 버튼을 누른다.

10단계: 지갑 확인 및 최종 발행
1. 지갑 팝업 창이 여러 번 나타나며, 각각의 트랜잭션을 승인해야 한다. 이는 배포 과정에 필요한 가스비 확인 절차다. (가스비로 사용할 테스트 이더가 없으면 실패한다.)


2. 잠시 후 배포가 완료되었다는 메시지가 표시된다. “View NFT” 버튼을 눌러 결과를 확인한다.

3. 축하한다. 이번에는 대체 불가능한 토큰(NFT)이 발행되었다.

11단계: 내 지갑으로 NFT 가져오기(Claim)
- 발행된 NFT는 thirdweb 플랫폼에서 위탁 판매도 가능하다. 하지만 테스트 목적이므로 내 지갑으로 가져와 보자.
1. 좌측 ‘NFTs’ 메뉴 또는 우측의 ‘View all →’ 버튼을 클릭한다.

2. 내 지갑으로 보내려고 하는 NFT를 클릭한다.

3. ‘Claim’ 탭을 클릭한다.
4. 기본으로 내 지갑 주소가 입력되어 있으므로, 수량을 지정한 뒤 ‘Claim’ 버튼을 누른다.

5. 메타마스크 서명 창이 뜨면 ‘컨펌’버튼을 클릭한다.

6. 메타마스크 지갑의 NFT 탭으로 이동하면, 내가 만든 NFT가 실제 자산처럼 표시된다. (경우에 따라 수초에서 수분까지 걸리기도 한다.)

여기서 왜 NFT 그림이 뜨지 않는지 모르겠다. 아마도 테스트넷이여서 그런게 아닐까 생각한다. 메인넷에서는 내 그림이미지가 바로 표시가 된다. 정상적으로 NFT 발행이 된 것이니 걱정할 필요는 없다.
이 과정을 통해 학습자는 NFT를 단순한 그림 파일이 아니라, 블록체인 위에서 고유성과 희소성을 가진 자산으로 체험할 수 있다.
온체인 데이터 확인
1. ERC-1151 컨트랙트 생성
- 트랜잭션

사용자의 지갑 주소에서 thirdweb 팩토리 컨트랙트를 호출하여 새로운 NFT 컬렉션 컨트랙트를 배포한 내역을 보여준다.
Transaction Hash와 Status가 기록되어 있으며, To 항목에는 팩토리 주소가 나타난다.
하단의 Created 표시와 함께 새로운 컨트랙트 주소가 생성되었음을 확인할 수 있다.
이는 ERC-721 또는 ERC-1155 표준 기반의 NFT 컨트랙트가 블록체인 위에 배포된 순간을 의미한다.
- 내부 트랜잭션

같은 트랜잭션을 Internal Txns 탭에서 살펴본 결과이다.
create2 방식으로 새로운 컨트랙트가 생성되었음이 기록되어 있다.
이는 thirdweb 팩토리가 deterministic 방식으로 NFT 컨트랙트를 배포하였다는 뜻이며, 해당 주소는 앞으로 발행되는 NFT들의 거점이 된다.
즉, 첫 번째 그림은 겉으로 드러난 컨트랙트 생성 내역을 보여주고, 두 번째 그림은 그 내부에서 실제로 create2 연산이 실행된 과정을 보여주는 것이다.
2. NFT 민트 트랜잭션

사용자가 NFT 컨트랙트에 대해 Lazy Mint 함수를 호출하여 새로운 NFT를 발행한 트랜잭션을 보여준다.
Transaction Hash, Block, Timestamp와 함께 From은 사용자의 지갑 주소, To는 NFT 컨트랙트 주소가 기록되어 있다.
해당 호출이 성공하면서 새로운 토큰 ID가 생성된다.

같은 트랜잭션을 Internal Txns 탭에서 확인한 결과이다.
delegatecall 방식으로 Transfer 이벤트가 발생하여, 컨트랙트 내부에서 새로 발행된 NFT가 지정된 지갑 주소로 전송된 과정이 기록되어 있다.
이는 ERC-721 또는 ERC-1155 표준에서 정의하는 발행 방식에 따라, 0x0 주소로부터 해당 지갑으로 소유권이 이동한 것으로 해석된다.
즉, 세 번째 그림은 겉으로 드러난 민트 호출이고, 네 번째 그림은 그 내부에서 실제로 실행된 전송 과정이다. 두 그림을 통해 민트 요청과 소유권 할당이 함께 일어났음을 확인할 수 있다.
3. 멀티콜을 통한 NFT 대량 민트

사용자가 NFT 컨트랙트에 Multicall 함수를 호출하여 여러 개의 NFT를 한 번에 발행한 트랜잭션을 보여준다.
Transaction Hash, Block, Timestamp가 기록되어 있으며, From은 사용자의 지갑 주소, To는 NFT 컨트랙트 주소가 나타나 있다.
이 과정은 단일 호출로 여러 민트 요청을 묶어 실행하는 방식이다.

같은 트랜잭션의 Internal Txns 탭을 통해 확인한 실행 내역이다.
delegatecall이 연속적으로 다섯 차례 발생하였고, 각 호출마다 Transfer 이벤트가 실행되어 새로운 토큰 ID가 서로 다른 지갑으로 혹은 같은 지갑으로 순차적으로 발행되었다.
이러한 구조는 다수의 NFT를 일괄적으로 생성할 때 가스 비용을 절약하고, 여러 건의 민트를 하나의 트랜잭션으로 처리할 수 있게 한다.
즉, 상단 그림은 겉으로 드러난 멀티콜 트랜잭션이고, 하단 그림은 그 내부에서 실제로 여러 건의 Transfer가 실행된 세부 절차이다. 이를 통해 단일 호출로 다수의 NFT가 발행되었음을 알 수 있다.
4. ETH 결제와 ERC-1155 토큰 발행

NFT 민트 과정에서 발생한 내부 트랜잭션을 보여준다.
사용자의 지갑이 NFT 컨트랙트를 호출하자, 컨트랙트 내부에서 두 건의 Transfer가 실행되었다.
첫 번째는 0.0005 ETH가 외부 수수료 지갑으로 전송된 내역이며, 두 번째는 0.0995 ETH가 다시 사용자 지갑으로 반환된 내역이다.
이는 실제 결제 과정에서 일부 금액이 수수료로 사용되고, 나머지는 환불 또는 잔액 정산된 결과로 볼 수 있다.

같은 트랜잭션을 전체적으로 보여주고 있다.
Transaction Action 항목에는 “Mint 1 of CAT”이라는 문구가 기록되어 있으며, 이는 ERC-1155 표준에 따라 특정 토큰 ID가 발행되었음을 의미한다.
Internal Transactions 영역에서는 위에서 확인한 ETH 이동이 표시되고, ERC-1155 Tokens Transferred 항목에는 Token ID 0번이 새로 발행되어 사용자의 지갑 주소로 전송된 사실이 기록되어 있다.
즉, 상단 그림은 내부적으로 발생한 ETH 이동을 드러내고, 하단 그림은 같은 트랜잭션에서 ERC-1155 토큰이 실제로 발행되어 사용자의 지갑으로 들어온 최종 결과를 보여준다.
이를 통해 NFT 민트 과정이 단순한 토큰 생성만이 아니라, 결제와 정산 절차까지 포함된 종합적인 거래임을 확인할 수 있다.