昨天我們把資料都處理好了,現在我們終於進行可以最後的步驟,也就是程式編譯,要怎麼直接讓合約偵測使用者的錢包呢?我們就一起看下去吧!
到最熟悉的Openzeppelin
點選似曾相識的Wizard,不過特別注意的是,不用勾選URI Storage,因為我們不用上鏈之後編輯。
讓我們回到Remix編譯
    uint256 MAX_SUPPLY = 10;
   
這邊我們一樣新增最大供給量
    string baseURI = "ipfs://QmSFFACYLvFBML6TLQCPPU947SQgjetFLz6g1oTqfeamCV/";
往下我們再新增URI,需要到Pinata那邊複製

而這邊要特別注意的是需要填入ipfs://...../最後需要再一條斜線
因為我們上傳的是資料夾,而token ID是從0開始計算的,所以在後面需要多一條斜線
範例:

        function safeMint() public {
        uint256 tokenId = _tokenIdCounter.current();
        require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
        string memory uri = string(abi.encodePacked(baseURI,Strings.toString(tokenId)));
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
    }
這邊msg.sender可以自動連接使用者錢包,不需要再輸入地址


一樣編譯+上鏈

之後點選SafeMint連接錢包,就可以了

當成功之後就可以在Opensea testnet上看到你心愛的NFT了!

這是連續10次mint的結果
到這邊你已經可以自己發行你的NFT了,恭喜各位,明天我們再來研究看看還有沒有地方可以再改進的吧!
明天可以試試看如何去限制一個人可以mint的數量。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyToken is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;
    uint256 MAX_SUPPLY = 10;
    string baseURI = "ipfs://CID/";
    string public baseExtension = ".json";
    constructor() ERC721("I'mma Man NFT", "IMMN") {}
    function safeMint() public {
        uint256 tokenId = _tokenIdCounter.current();
        require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
        string memory uri = string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
    }
    // The following functions are overrides required by Solidity.
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}