カートに入れました

NFTを作るときはOpen Zeppelinを使おう

NFTの作り方がわからないからどうやって作るのかググって調べてみるとOpen Zeppelinという言葉が出てくる。

Open Zeppelinのホームページ

  • OpenZeppelinは、分散型アプリケーションを構築、自動化、運用するためのセキュリティ製品を提供します。

Github OpenZeppelin/openzeppelin-contracts

NFTはSolidityという言語を使って作られる。 OpenZeppelinはSolidityのライブラリとしてNFTトークンの雛形となるコードが用意してくれている。

以下のような感じでimportして使う

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721PresetMinterPauserAutoId {
    constructor()
        public
        ERC721PresetMinterPauserAutoId(
            "MyNFT", // トークン名
            "NFT",  // シンボル
            "https://example.com/token/" // TokenURI
        )
    {}
}
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract NFT is Context, ERC721Enumerable, Ownable {
    // uint256 に対して toString() を呼び出すのに必要
    using Strings for uint256;

    constructor(
        string memory name,
        string memory symbol
    ) ERC721(name, symbol) {}

    function mint(address to) public virtual {
        _mint(to, totalSupply());
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return string(abi.encodePacked("https://example.com/", tokenId.toString(), ".json"));
    }
}

参考