# ERC-721 Contract 만들기

Remix를 이용하여 ERC-721 컨트랙트 배포 테스트를 진행하는 것이 가능합니다.

{% hint style="danger" %}
주의

한번 배포된 컨트랙트는 수정 및 삭제가 불가능합니다.\
필요한 정보를 포함한 Code로 작성하여 배포해주세요.
{% endhint %}

아래의 순서로 컨트랙트 배포 과정을 진행해 보도록 하겠습니다.

* Step 1 : Remix 사이트에 접속하여 파일 생성하기
* Step 2 : ERC-721 컨트랙트 작성하기
* Step 3 : SOLIDITY COMPILER 탭으로 이동하여 버전 맞추고 컴파일하기
* Step 4 : DEPLOY & RUN TRANSACTIONS 설정하기
* Step 5 : MetaMask 가스비용 설정 및 서명하기

{% hint style="info" %}
아래 예제는 WEMIX3.0 테스트넷을 기반으로 작성되었습니다.
{% endhint %}

### Step 1 : Remix 사이트에 접속하여 파일 생성하기

<https://remix.ethereum.org> 로 접속하면 다음과 같습니다.&#x20;

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/hiDl7o8hnmDM22KHUfQe/00.Remix%20%E1%84%8E%E1%85%A9%E1%84%80%E1%85%B5%20%E1%84%92%E1%85%AA%E1%84%86%E1%85%A7%E1%86%AB.png" alt=""><figcaption><p>Remix 초기 화면</p></figcaption></figure>

contracts 디렉터리에 Storage.sol, Owner.sol, Ballot.sol 세가지의 예제 스마트 컨트랙트가 보여지게 되며, 새로 작성하려면 이를 선택하여 지우고 새 파일을 생성합니다.

아래 그림은 contracts 디렉터리에 `MyNFT.sol` 파일을 생성하는 예입니다.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/WNNIHDBWffISPDlpqapm/01.%E1%84%91%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%AF%20%E1%84%89%E1%85%A2%E1%86%BC%E1%84%89%E1%85%A5%E1%86%BC.png" alt=""><figcaption><p>파일 생성</p></figcaption></figure>

### Step 2 : ERC-721 컨트랙트 작성하기

다음과 같은 ERC-721 컨트랙트를 작성할 수 있습니다.&#x20;

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract MSNFT is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() public ERC721("Name", "Symbol") {}

    function mintNFT(address recipient, string memory tokenURI) public onlyOwner returns (uint256){
    
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
        function burn(uint256 tokenId) public virtual returns (bool) {
        
        _burn(tokenId);

        return true;
    }
}
```

사용자가 원하는 Token Name, Token Symbol을 지정할 수 있습니다.

아래 코드에서 'Name', 'Symbol' 부분에 사용자가 원하는 Name, Symbol을 입력해주면 됩니다.

```
    constructor() public ERC721("Name", "Symbol") {}
```

아래 그림은 'WMNFT', 'NFT'로 지정하는 예입니다.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/0xyxIywYCdBhOPaxOawF/01.%E1%84%8B%E1%85%A8%E1%84%8C%E1%85%A6%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3.png" alt=""><figcaption><p>예제 코드</p></figcaption></figure>

### Step 3 : SOLIDITY COMPILER 탭으로 이동하여 버전 맞추고 컴파일하기

코드가 작성되면 솔리디티 컴파일러 화면에 맞는 컴파일러 버전을 선택한 후 컴파일을 할 수 있습니다.

제공되는 예제 코드의 컴파일러 버전은 0.8.10으로, 해당 버전 이하로 컴파일러 버전을 선택해야 합니다.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/D575BWHw4mpxvwavYvb4/02.%E1%84%8B%E1%85%A8%E1%84%8C%E1%85%A6%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3%20%E1%84%8F%E1%85%A5%E1%86%B7%E1%84%91%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%AF.png" alt=""><figcaption><p>예제 코드 컴파일</p></figcaption></figure>

### Step 4 : DEPLOY & RUN TRANSACTIONS 설정하기

Deploy & Run Transactions 화면에서 배포하려고 하는 환경을 선택하고 스마트 컨트랙트를 배포하여 테스트를 해볼 수 있습니다.&#x20;

아래 그림은 환경(ENVIRONEMNT)를 'Injected Provider - MetaMask'로 지정한 예입니다.

환경(ENVIRONEMNT)을 'Injected Provider - MetaMask'로 선택하게 되면 MetaMask로 연결이 되는데, 이 때 네트워크가 'WEMIX\_Testnet'연결이  필요합니다.\
\
MetaMask 연결과 관련된 내용은 [Use MetaMask](https://docs.wemix.com/ko/quick-start/account/use-metamask) 참고하십시오.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/GJNytqneWKjuNrvoRbgv/03.%20%E1%84%87%E1%85%A2%E1%84%91%E1%85%A9%E1%84%92%E1%85%AA%E1%86%AB%E1%84%80%E1%85%A7%E1%86%BC%20%E1%84%89%E1%85%A5%E1%86%AF%E1%84%8C%E1%85%A5%E1%86%BC.png" alt=""><figcaption><p>배포환경 설정</p></figcaption></figure>

### **Step 5 : MetaMask 가스비용 설정 및 서명하기**

Deploy & Run Transactions 화면에서의 설정이 끝나고 'Deploy' 를 선택하면 아래와 같이 MetaMask 팝업이 뜨며 이더리움을 기반으로 기본 설정된 'Gas fee'를 보여주는 화면이 나옵니다.&#x20;

WEMIX는 이더리움과는 다른 Fee 정책을 가지고 있으므로 반드시 'Site suggested'을 선택하여 Gas fee를 변경해 주셔야 합니다.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/oSUrcmkprJ0fOrWaGMIf/03.1.%20%E1%84%80%E1%85%B5%E1%84%87%E1%85%A9%E1%86%AB%20%E1%84%89%E1%85%A5%E1%86%AF%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%83%E1%85%AC%E1%86%AB%20%E2%80%9CGas%20fee%E2%80%9D.png" alt=""><figcaption><p>MetaMask 기본 설정된 'Gas fee'</p></figcaption></figure>

아래 화면에서 'Advanced'를 선택하면 사용자가 'Max priority fee (GWEI)'와 'Max fee(GWEI)'를 수동으로 설정 할 수 있습니다.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/jhensDNeuAqMRGGKVZTN/03.2.%20%E1%84%80%E1%85%B5%E1%84%87%E1%85%A9%E1%86%AB%20gas%20fee.png" alt=""><figcaption><p>MetaMask 기본 설정된 'Gas fee' 설정 진입화면</p></figcaption></figure>

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/6uOD3usX1tmD2fDSKRB5/03.3.%20gas%20fee%20%E1%84%87%E1%85%A7%E1%86%AB%E1%84%80%E1%85%A7%E1%86%BC.png" alt=""><figcaption><p>“Gas fee” 수동 설정</p></figcaption></figure>

현재 WEMIX는 고정 'Max priority fee(GWEI)'를 사용하고 있으며 값은 100입니다.&#x20;

Max fee는 사용자가 정의하는 값으로 최소값은 MaxPriorityFee+BASE\_FEE입니다.&#x20;

WEMIX의 BASE\_FEE는 EIP-1559를 따라 가변입니다. 따라서, Transaction이 성공적으로 만들어지기 위해서는 아래와 같이 설정해 주시기를 권장 드립니다.&#x20;

1. Max base fee (GWEI) = 101
2. Max priority fee (GWEI) = 100&#x20;

위 그림에서 Fee 설정을 완료하고 'Save'를 선택하면 아래의 그림과 같이 배포 준비가 완료됩니다.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/Jc7ePYopb8B6VfvnKUsw/03.4.%20gas%20fee%20%E1%84%87%E1%85%A7%E1%86%AB%E1%84%80%E1%85%A7%E1%86%BC%E1%84%8B%E1%85%AA%E1%86%AB%E1%84%85%E1%85%AD.png" alt=""><figcaption><p>“Gas fee” 수동 설정 완료</p></figcaption></figure>

위 그림에서 'Confirm'을 선택하면 컨트랙트 배포가 진행됩니다.

아래 그림처럼 Remix 화면 하단에 초록색 체크마크가 나오면 정상적으로 배포가 완료된 것 입니다.

<figure><img src="https://content.gitbook.com/content/iXnTk8WgxaTaNidAuUYQ/blobs/y1VfuisvajzkPN2TaNqx/04.%20ERC-721%20%E1%84%8B%E1%85%A8%E1%84%89%E1%85%B5%20%E1%84%8F%E1%85%A5%E1%86%AB%E1%84%90%E1%85%B3%E1%84%85%E1%85%A6%E1%86%A8%E1%84%90%E1%85%B3%20%E1%84%87%E1%85%A2%E1%84%91%E1%85%A9%20%E1%84%8B%E1%85%AA%E1%86%AB%E1%84%85%E1%85%AD.png" alt=""><figcaption><p>ERC-721 예시 컨트랙트 배포 완료</p></figcaption></figure>
