NFT卡牌盲盒系統(tǒng)開發(fā)(開發(fā)案例)丨NFT卡牌盲盒開發(fā)源碼詳情
作為一種可能的Web3.0底層技術(shù),區(qū)塊鏈以去中心化、不可篡改、可溯源等特點(diǎn),構(gòu)建起數(shù)字經(jīng)濟(jì)時代的全新信任體系。
從技術(shù)角度分析,區(qū)塊鏈讓數(shù)字資產(chǎn)價值流轉(zhuǎn)的每一個節(jié)點(diǎn)都公開透明、有跡可循且不可篡改,這將會讓W(xué)eb3.0時代的一切交易變得更加真實(shí)可信。
同時,數(shù)據(jù)通過區(qū)塊鏈技術(shù)可以確定權(quán)屬,實(shí)現(xiàn)數(shù)據(jù)的資產(chǎn)化,這也將使得區(qū)塊鏈成為Web3.0時代的基礎(chǔ)設(shè)施。
//SPDX-License-Identifier:MIT
pragma solidity^0.8.10;
import"openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import"openzeppelin/contracts/access/Ownable.sol";
import"openzeppelin/contracts/utils/Strings.sol";
contract NftMeta is ERC721Enumerable,Ownable{
using Strings for uint256;
//是否準(zhǔn)許nft開賣-開關(guān)
bool public _isSaleActive=false;
//初始化盲盒,等到一定時機(jī)可以隨機(jī)開箱,變成true
bool public _revealed=false;
//nft的總數(shù)量
uint256 public constant MAX_SUPPLY=10;
//鑄造Nft的價格
uint256 public mintPrice=0.3 ether;
//鑄造的錢包最多只能有一個nft數(shù)量
uint256 public maxBalance=1;
//一次mint的nft的數(shù)量
uint256 public maxMint=1;
//盲盒開關(guān)打開后,需要顯示開箱的圖片的base地址
string baseURI;
//盲盒圖片的meta,json地址,后文會提到
string public notRevealedUri;
//默認(rèn)地址的擴(kuò)展類型
string public baseExtension=".json";
mapping(uint256=>string)private _tokenURIs;
//構(gòu)造器
constructor(string memory initBaseURI,string memory initNotRevealedUri)
ERC721("Nft Meta","NM")//實(shí)現(xiàn)了ERC721的父類構(gòu)造器,是子類繼承的一種實(shí)現(xiàn)方式
{
setBaseURI(initBaseURI);
setNotRevealedURI(initNotRevealedUri);
}
//外部地址進(jìn)行鑄造nft的函數(shù)調(diào)用
function mintNftMeta(uint256 tokenQuantity)public payable{
//校驗(yàn)總供應(yīng)量+每次鑄造的數(shù)量<=nft的總數(shù)量
require(
totalSupply()+tokenQuantity<=MAX_SUPPLY,
"Sale would exceed max supply"
);
//校驗(yàn)是否開啟開賣狀態(tài)
require(_isSaleActive,"Sale must be active to mint NicMetas");
//校驗(yàn)鑄造的錢包地址中的nft的數(shù)量+本次鑄造的數(shù)量<=該錢包最大擁有的nft的數(shù)量
require(
balanceOf(msg.sender)+tokenQuantity<=maxBalance,
"Sale would exceed max balance"
);
//校驗(yàn)本次鑄造的數(shù)量*鑄造的價格<=本次消息附帶的eth的數(shù)量
require(
tokenQuantity*mintPrice<=msg.value,
"Not enough ether sent"
);
//校驗(yàn)本次鑄造的數(shù)量<=本次鑄造的最大數(shù)量
require(tokenQuantity<=maxMint,"Can only mint 1 tokens at a time");
//以上校驗(yàn)條件滿足,進(jìn)行nft的鑄造
_mintNftMeta(tokenQuantity);
}
//進(jìn)行鑄造
function _mintNftMeta(uint256 tokenQuantity)internal{
for(uint256 i=0;i<tokenQuantity;i++){
//mintIndex是鑄造nft的序號,按照總供應(yīng)量從0開始累加
uint256 mintIndex=totalSupply();
if(totalSupply()<MAX_SUPPLY){
//調(diào)用erc721的安全鑄造方法進(jìn)行調(diào)用
_safeMint(msg.sender,mintIndex);
}
}
}
//返回每個nft地址的Uri,這里包含了nft的整個信息,包括名字,描述,屬性等
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns(string memory)
{
require(
_exists(tokenId),
"ERC721Metadata:URI query for nonexistent token"
);
//盲盒還沒開啟,那么默認(rèn)是一張黑色背景圖片或者其他圖片
if(_revealed==false){
return notRevealedUri;
}