ジェネレーティブNFT作成ツールから書き出したNFTを独コン作ってmintするやり方(仮稿)

NFT-Inatorなどの外部ツールを使って1万点などのNFTを作るのが流行っているみたいですが、手動でmintするの面倒ですよね?ツールでまとめてやってみます。

独自コントラクト + IPFSというトレンドにも対応。

手動よりは楽なはず。

①データを用意する。こんな感じに書き出されたjsonファイルとpngを用意します。

②画像とjsonファイルを分ける。

こんな風に画像だけ入ったフォルダと、同じくjsonだけ入ったフォルダを作ってください。

③画像をIPFSにアップロードする。

pinataというサイトを使って、画像フォルダをまるごとIPFSにアップロードします。

無料の会員登録したら、左上のUploadボタンを押して、Folderを選択。

先ほど画像だけ入れたフォルダを選択します。名前は何でもいいです。取り敢えず「testimages」にしました。

こんな感じの行が出来ているはずなので(なかったらページを更新)、CIDをコピーしておきます。右側のアイコンをクリックしてもコピーできます。今回は「QmXW7NQbFEzdysvPmrvCcyh3rCduhq6NBBXLfadbc3NSkF」です。(これを※1とします)

これがIPFS上の画像置き場を表します。この後使います。

④jsonに画像の場所を反映する

jsonファイルの中にNFTのデータが入っているので、ここに画像の場所を反映してあげないといけません。

でも100ファイル手動で直したくないので自動でやってくれるファイルを作りました。

bat1,bat2というファイルをダウンロードします。(後でどこかに置く) 以下の記事を参考に作成させていただきました。ありがとうございます。

知識ゼロからのwindowsバッチファイル超入門 - ファイル内の文字列を置換する

bat1を開くとこのようになっているので、「■ここにCID■」と書かれた場所に※1で入手した文字列を入れます。
また、「■ここに作成個数-1の数■」と書かれた場所に作成個数から1引いた数を入れます。100個作るなら99です。

こうなります。

bat2も同じようにしてください。

そうしたら、bat1,bat2の順番にクリックします。

最終的に拡張子の無い0~99のファイルが出来上がるはずなので、それをフォルダにまとめます。

⑤jsonフォルダのアップロード

③で画像をアップロードしたのと同じようにアップロードします。

今回はCIDが「Qmdv3s7ogHvEQzSxAUF8fUDpCeNmLFSE9HFdmBviPSnbjT」(※2とします)でした。

⑥独自コントラクトのコードを書く(ほぼ書かない)

remixにアクセスします。左側の「contract」をクリックして開きます。

右クリック→New fileで新しく作ります。

名前は何でもいいです。ZUGTES3にしました。

中身に以下をコピペします。

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

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


contract TAKUSAN_MINT_SURU_KONTORAKUTO is ERC721, ERC721URIStorage,ERC721Royalty, Ownable { //1. コントラクトの名前を決める(デフォルトでも良いが、ダサいので変えてください)
    using SafeMath for uint256;
    uint256 public tokenCounter;
    string private _baseTokenURI;
    uint256 public constant MAX_QUANTITY = 100; //2. ここに発行枚数を入れる
    constructor (
        string memory baseTokenURI
        ) ERC721 ("TAKUSAN_MINT_TEST", "TAKT"){ //3. ここにコレクションの名称と略称を入れる
        tokenCounter = 0;
        address receiver = 0x056f25e62C244e912b8DDbAaa2f35753FC5b6A3A; //4. ここに二次流通の手数料を受け取るアドレスを入れる(対応しているマーケットプレイスのみで意味がある)
        uint96 feeNumerator = 1000; //5. ここに手数料率を入れる(100倍すること。1000なら10%になる)
        _setDefaultRoyalty(receiver, feeNumerator);  
        _baseTokenURI = baseTokenURI;
    }
   
       function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function createCollectible() public onlyOwner { 
        for (uint i = 0; i < MAX_QUANTITY; i++) {
        _safeMint(msg.sender, tokenCounter);
        _setTokenURI(tokenCounter, uint2str(tokenCounter));
        tokenCounter = tokenCounter + 1;
    }
    }
    
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
    
    
        function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage,ERC721Royalty) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

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

いい感じに色付きで反映されるはずです。

いくつか変えないといけないところがあるので、緑色の文字に従って1~5まで変更します。今回はそのまま行きます。どこと対応しているか分かりやすいので。

⑦ブロックチェーンにコントラクトを立てる

左のアイコンの上から3番目のアイコンをクリック。「Compile 〇〇.sol」の青いボタンを押します。

3番目のアイコンにOKそうなマークが付いたら成功。

4番目のアイコンをクリックして、いくつか設定を変えます。

まず1番上の「ENVIRONMENT」を「Injected Web3」に変更。Metamask等の自分の埋め込みウォレットを使う設定です。

下の方の「CONTRACT」を先ほど設定したコントラクト名に変更。今回は「TAKUSAN_MINT_SURU_KONTORAKUTO」になります。

Deployの横に入力できる欄が出てくるので、「https://ipfs.io/ipfs/■⑤で入手したCID■/」と入力。

今回なら「https://ipfs.io/ipfs/Qmdv3s7ogHvEQzSxAUF8fUDpCeNmLFSE9HFdmBviPSnbj/」です。(スペース等が間に入らないよう注意!)

こうなります。

そしたらDeployをクリック。Metamskが出てくるので変なこと書かれていないのを確認して確認ボタンをクリック。

⑧MINTする。

ブロックチェーン上でコントラクトが使用できる状態になると、下にこのように出てきます。

開きます。色々ボタンがありますが、上から二番目の「createCollectivle」をクリック。

ガス代を支払う画面が出てくるので、変なことが書かれていたりガス代が大変なことになっていないか確認してクリック。

トランザクションが通れば完了です。

mintしたアドレスでOpenseaに行って確認するなり、こんな風にコントラクトアドレスをコピーしてopenseaで検索するなりしてみてください。

こんな風に表示されるはずです。

今回テストで作ったコレクション → https://opensea.io/collection/takusan-mint-test-v3

コメントを残す

メールアドレスが公開されることはありません。