How to Develop an NFT Smart Contract (ERC 721) with Alchemy

Week 1, How To Develop an NFT Smart Contract (ERC721) with Alchemy

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/[email protected]/utils/Counters.sol";

// Alchemy๋Š” ์ด๋ฆ„, ERC721 ์ดํ•˜๋Š” ๋ชจ๋‘ ์ƒ์†์„ ๋ฐ›์€ ์ปจํŠธ๋ž™ํŠธ๋“ค
contract Alchemy is ERC721, ERC721Enumerable, ERC721URIStorage {
    using Counters for Counters.Counter;

    // private, public, internal, external ...
    // private์€ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๋‚ด์—์„œ๋งŒ ๋ณด์ด๊ณ , ๋‚ด๋ถ€์—์„œ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    Counters.Counter private _tokenIdCounter;

    // MAX NUMBER OF COUNTERS
    uint256 MAX_SUPPLY = 10000;

    // ์ƒ์„ฑ์ž, Alchemy๋Š” ์ด๋ฆ„, ALCH๋Š” Symbol
    constructor() ERC721("Alchemy", "ALCH") {}

    // minting์€ ์ƒˆ๋กœ์šด ํ† ํฐ ํ˜น์€ ์—”ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ํ–‰์œ„
    // action of create a new entry or thing onto the blockchain
    // nft๋ฅผ ์ „์†กํ•  wallet์˜ ์ฃผ์†Œ, token uri๋ฅผ ๋ฐ›๋Š”๋‹ค
    // public ๊ณผ onlyOwner ๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋‘๊ฐ€ ๋ณด๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    function safeMint(address to, string memory uri) public {
        // ํ˜„์žฌ ํ† ํฐ id๋ฅผ ์นด์šดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.
        uint256 tokenId = _tokenIdCounter.current();
        // MAX_SUPPLY์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ๊ฒ€์‚ฌ
        require(tokenId <= MAX_SUPPLY, "I'm sorry all NFTs have been minted");
        // ํ† ํฐ id ์ฆ๊ฐ€
        _tokenIdCounter.increment();
        // nft ๋ฏผํŒ…
        _safeMint(to, tokenId);
        // token uri ์„ธํŒ…
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.
    // overribe ํ•œ ๋ฉ”์†Œ๋“œ๋“ค

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // internal์€ private๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ์ปจํŠธ๋ž™ํŠธ ๋‚ด๋ถ€ ํ˜น์€ ์ƒ์†๋œ ์ปจํŠธ๋ž™ํŠธ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

    // tokenId๋ฅผ ๋„˜๊ธฐ๊ณ  tokenUri๋ฅผ ๋ฆฌํ„ด ๋ฐ›๋Š”๋‹ค.
    // view๋Š” reading ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” modifier
    // writeํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ, gas๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค !
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Last updated