NFT數字藏品開發丨NFT盲盒數藏系統技術開發丨DAPP丨Defi丨NFT

JT1769119發表於2023-04-07

NFT(非同質化代幣)是一種數字資產,由於其一性和不可分割性,正變得越來越受歡迎。NFT盲盒藏品是NFT市場中

比較新的概念,類似於傳統的盲盒玩具,藏品的內容只有在買後才能被揭示。在這篇文章中,我們將探討如何使

用Solidity編寫一個簡單的NFT盲盒合約。


盲盒名稱

盲盒符號(用於在交易所顯示)

每個盲盒的價格

盲盒總數

NFT詳細資訊(名稱,說明,圖片等)

盲盒銷售狀態

下面是一個簡單的Solidity程式碼示例:


pragma solidity ^0.8.0;


import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

import "@openzeppelin/contracts/utils/Counters.sol";

import "@openzeppelin/contracts/access/Ownable.sol";


contract NFTMysteryBox is ERC721URIStorage, Ownable {

    using Counters for Counters.Counter;

    Counters.Counter private _tokenIds;


    string private _name = "NFT Mystery Box";

    string private _symbol = "NMTBX";


    uint256 private _price = 0.01 ether;

    uint256 private _totalBoxes = 100;

    uint256 private _boxesSold = 0;


    struct NFT {

        string name;

        string description;

        string imageURI;

    }


    mapping(uint256 => NFT) private _nftDetails;

    mapping(uint256 => bool) private _boxSales;


    constructor() ERC721(_name, _symbol) {}


    function purchaseBox() public payable {

        require(msg.value >= _price, "Insufficient ether provided to purchase the box.");

        require(_boxesSold < _totalBoxes, "No boxes remaining for sale");


        _boxesSold += 1;

        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();

        _safeMint(msg.sender, newItemId);


        // Generate random NFT details

        bytes32 hash = keccak256(abi.encodePacked(newItemId, block.number));

        uint256 nftIndex = uint256(hash) % 10;  // We have 10 unique NFTs to generate from.

        NFT memory newNFT = NFT(

            // Just for this example, using placeholders instead of real information for the NFT

            string(abi.encodePacked("NFT #", nftIndex)),

            string(abi.encodePacked("This is a description of NFT #", nftIndex)),

            string(abi.encodePacked(" nftIndex, ".png"))

        );

        _nftDetails[newItemId] = newNFT;

        _boxSales[newItemId] = true;


        // Refund any excess ether paid by the sender

        if (msg.value > _price) {

            uint256 refundAmount = msg.value - _price;

            payable(msg.sender).transfer(refundAmount);

        }

    }


    function tokenURI(uint256 tokenId)

        public

        view

        virtual

        override(ERC721URIStorage)

        returns (string memory)

    {

        require(_exists(tokenId), "Token does not exist");


        NFT memory nftData = _nftDetails[tokenId];

        string memory baseURI = super.tokenURI(tokenId);


        return bytes(baseURI).length > 0

            ? string(abi.encodePacked(baseURI, "#name=", nftData.name, "&description=", 

nftData.description, "&imageURI=", nftData.imageURI))

            : "";

    }


    function withdraw() public onlyOwner {

        uint256 balance = address(this).balance;

        payable(msg.sender).transfer(balance);

    }

}


上述程式碼定義了一個名為NFTMysteryBox的合約,繼承了OpenZeppelin庫中的ERC721URIStorage和Ownable合約。該合約包含了一些重要變數和函式,包括:

  1. _name_symbol:用於定義盲盒的名稱和符號,並在交易所上顯示。

  2. _price_totalBoxes

用於定義每個盲盒的價格和總數。當盲盒銷售狀態為false時,合約將拒絕任何購買盲盒的嘗試。

  1. NFT 結構體:

用於儲存每個盲盒內隨機生成的NFT的詳細資訊,包括名稱,說明和圖片URI。

  1. purchaseBox() 函式:

用於購買盲盒。該函式要求傳送足夠的ETH以支付盲盒價格,並使用“_tokenIds”計數器來分配不同的tokenId。

  1. tokenURI() 函式:

用於獲取一個特定tokenId的NFT詳細資訊,並將其作為JSON字串返回給客戶端。

  1. _boxesSold 和  _boxSales 對映:

用於跟蹤盲盒的銷售情況。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69982110/viewspace-2944275/,如需轉載,請註明出處,否則將追究法律責任。

相關文章