NFT-Inatorなどの外部ツールを使って沢山のNFT(1万枚とか!)を作るのが流行っているみたいですが、手動でmintするの面倒ですよね?まとめてmintするやり方をまとめます。
独自コントラクト + IPFSというトレンドに対応。
手動で頑張ってmintする時間をもっとクオリティをあげる方向に使えたらいいなーと思って書いてます。
役立ったらこちらのアドレスにNFTとかMATICとか送ってくれると嬉しいです。モチベが上がります。
ETH,Polygon共通 : 0x056f25e62C244e912b8DDbAaa2f35753FC5b6A3A
目次
①データを用意する。
こんな風に書き出されたjsonファイルとpngを用意します。
②画像とjsonファイルを分ける。
こんな風に画像だけ入ったフォルダと、同じくjsonだけ入ったフォルダを作ってください。フォルダの名前は何でもいいですが、個人情報はやめておいた方が無難です。
③画像をIPFSにアップロードする。
pinataというサイトを使って、画像フォルダをまるごとIPFSにアップロードします。
無料の会員登録をした後、左上の「Upload」ボタンを押して、「Folder」を選択。
先ほどの画像だけ入れたフォルダを選択します。名前を決めるよう言われますが、何でもいいです。取り敢えず「testimages」にしました。
この画像のような行が出来ているはずなので(なかったらページを更新)、CIDをコピーしておきます。右側のアイコンをクリックしてもコピーできます。今回は「QmXW7NQbFEzdysvPmrvCcyh3rCduhq6NBBXLfadbc3NSkF」です。(これを※1とします)
これがIPFS上の画像の場所を表します。この後使います。
④jsonに画像の場所を反映する
jsonファイルにはNFTの名前やプロパティなど色々な情報が書き込まれていて、その中に画像の置き場所も書かれています。ここに先ほどIPFSに置いた画像の場所を反映してあげないといけません。
でも100ファイル手動で直したくないので自動でやってくれるファイルを作りました。
以下の記事を参考に作成させていただきました。ありがとうございます。
知識ゼロからのwindowsバッチファイル超入門 - ファイル内の文字列を置換する
こちらをメモ帳にコピーして、jsonが入っているフォルダに「bat1.bat」というファイル名で保存してください。
@echo off
setlocal enabledelayedexpansion
for /l %%b in (0,1,■ここに作成個数-1の数■) do (
for /f "delims=" %%a in (%%b.json) do (
set line=%%a
echo !line:"image": "="image": "https://ipfs.io/ipfs/■ここにCID■/! >> 00_%%b_temp.json
)
)
endlocal
また、 こちらをメモ帳にコピーして、jsonが入っているフォルダに「bat2.bat」というファイル名で保存してください。
@echo off
setlocal enabledelayedexpansion
for /l %%b in (0,1,■ここに作成個数-1の数■) do (
for /f "delims=" %%a in (00_%%b_temp.json) do (
set line=%%a
echo !line:"uri": "="uri": "https://ipfs.io/ipfs/■ここにCID■/! >> %%b
)
)
endlocal
bat1を開くとこのようになっているので、「■ここにCID■」と書かれた場所に※1で入手した文字列を入れます。
また、「■ここに作成個数-1の数■」と書かれた場所に作成個数から1引いた数を入れます。100個作るなら99です。
こうなります。
そうしたら、bat1,bat2の順番にダブルクリックします。
最終的に拡張子の無い0~99のファイルが出来上がるはずなので、それをフォルダにまとめます。
(一緒に出来上がる00_xx_temp.jsonファイルは必要ないので削除してください。)
⑤jsonフォルダのアップロード
③で画像をアップロードしたのと同じようにアップロードします。
今回はCIDが「Qmdv3s7ogHvEQzSxAUF8fUDpCeNmLFSE9HFdmBviPSnbjT」(※2とします)でした。
⑥独自コントラクトのコードを書く(ほぼコピペ)
WEB上でETHのプログラム言語Solidityが書けてその他色々出来ちゃうサイトのremixにアクセスします。左側の「contract」をクリックして開きます。
右クリック→New fileで新しくcontractを作ります。これが独コンとよく言われるものの「コン」の部分です笑
名前は何でもいいです。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++) {
tokenCounter = tokenCounter + 1;
_safeMint(msg.sender, tokenCounter-1);
_setTokenURI(tokenCounter-1, uint2str(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/Qmdv3s7ogHvEQzSxAUF8fUDpCeNmLFSE9HFdmBviPSnbjT/」です。(スペース等が間に入らないよう注意!)(僕は失敗して無のNFTを作りました。)
入力が完了するとこうなります。
見直して問題なければ、「Deploy」をクリック。Metamskがポップアップするので変なこと書かれていないのを確認して確認ボタンをクリック。
⑧MINTする。
ブロックチェーン上でコントラクトが使用できる状態になると、下にこのようにコントラクトの名称が出てきます。
左側の右向きの矢印を押すと開きます。色々ボタンがありますが、上から二番目の「createCollectivle」をクリック。
ガス代を支払う画面が出てくるので、変なことが書かれていたりガス代が大変なことになっていないか確認してクリック。
トランザクションが通れば完了です。
⑨確認する。
mintしたアドレスでOpenseaに行って確認するなり、こんな風にコントラクトアドレスをコピーしてopenseaで検索するなりしてみてください。
今回テストで作ったコレクションのURLを以下に貼りました。このようにmintが出来ていれば成功です!
→ https://opensea.io/collection/takusan-mint-test-v3
何かあればコメントください!
IPFSのデータも完全に永遠という訳ではないので、以下を記事を併せて読むのがお勧めです。
役立ったらこちらのアドレスにNFTとかMATICとか送ってくれると嬉しいです。モチベが上がります。
ETH,Polygon共通 : 0x056f25e62C244e912b8DDbAaa2f35753FC5b6A3A
切実にこういった記事を探していてやっとたどり着きました。
前にRemixで10000点一気にmintしようとしてトランザクションが詰まってガス代1万円以上失った経験があります。
その後etherscanからmintしようとしたのですが10000点となるとやはりガス代がとんでもない事になります。
今回の場合、PolygonではなくETHでmintする場合ガス代がどのくらいになるのか、1万点一気にmint可能か、分かる範囲でご教授頂ければと思います。よろしくお願いします。