簡易版NFT合約程式碼

hickey發表於2022-04-24

本來是想一步一步從solidity基礎語法做個系列教程,但是這種基礎知識,網上資料已經很多了,一搜一大片,而且官方的文件也講的很詳細,所以本文預設是已經瞭解了相關的知識。

什麼是NFT

NFT 是我們用以代表獨特物品所有權的代幣。 NFT 讓我們把諸如藝術品、收藏品、甚至房地產等物品代幣化。 他們一次只有一個正式主人,並且受到以太坊區塊鏈的保護 - 沒有人可以修改所有權記錄或者根據現有的 NFT 複製貼上一份新的。

NFT 代表非同質化代幣。 非同質化是一個經濟術語,您可以用它來描述傢俱、歌曲檔案或您的電腦等物品。 這些東西不能與其他物品互換,因為它們具有獨特屬性。

另一方面,同質化物品可以互換,這取決於它們的價值而非獨特屬性。 例如,ETH 或美元具有同質化屬性,因為 1 ETH/1 USD 可以兌換成另外的 1 ETH/1 USD。

簡易版NFT合約程式碼

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';
import '@openzeppelin/contracts/access/Ownable.sol';

// 繼承ERC721, Ownable
contract SimpleMintContract is ERC721, Ownable {
    // mint 價格
    uint256 public mintPrice = 0.05 ether;
    // 總共已經被mint數量
    uint256 public totalSupply;
    // 可以mint的最大數量
    uint256 public maxSupply;
    // 是否開啟mint
    bool public isMintEnabled;
    // 每個地址mint => 數量
    mapping(address => uint256) public mintedWallets;

    // 建構函式,部署合約的時候,設定最大數量為2
    constructor() payable ERC721('Simple Mint', 'SIMPLEMINT') {
        maxSupply = 2;
    }

    // 外部呼叫函式,開啟mint
    function toggleIsMintEnabled() external onlyOwner {
        isMintEnabled = !isMintEnabled;
    }

    // 設定最大mint數量
    function setMaxSuppley(uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }

    // mint函式
    function mint() external payable {
        // require判斷函式,前半部判斷為false,則丟擲後半部分資訊
        // 判斷是否開啟mint
        require(isMintEnabled, 'minting not enabled');
        // 判斷地址是否已經mint
        require(mintedWallets[msg.sender] < 1, 'exceeds max per wallet');
        // 判斷髮送到合約的eth數量是否跟mint價格一樣
        require(msg.value == mintPrice, 'wrong value');
        // 判斷是否還有可以mint的數量
        require(maxSupply > totalSupply, 'sold out');

        mintedWallets[msg.sender]++;
        totalSupply++;
        uint256 tokenId = totalSupply;
        _safeMint(msg.sender, tokenId);
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章