NFT卡牌盲盒系统开发(开发案例)丨NFT卡牌盲盒开发源码详情
作为一种可能的Web3.0底层技术,区块链以去中心化、不可篡改、可溯源等特点,构建起数字经济时代的全新信任体系。
从技术角度分析,区块链让数字资产价值流转的每一个节点都公开透明、有迹可循且不可篡改,这将会让Web3.0时代的一切交易变得更加真实可信。
同时,数据通过区块链技术可以确定权属,实现数据的资产化,这也将使得区块链成为Web3.0时代的基础设施。
//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;
//是否准许nft开卖-开关
bool public _isSaleActive=false;
//初始化盲盒,等到一定时机可以随机开箱,变成true
bool public _revealed=false;
//nft的总数量
uint256 public constant MAX_SUPPLY=10;
//铸造Nft的价格
uint256 public mintPrice=0.3 ether;
//铸造的钱包最多只能有一个nft数量
uint256 public maxBalance=1;
//一次mint的nft的数量
uint256 public maxMint=1;
//盲盒开关打开后,需要显示开箱的图片的base地址
string baseURI;
//盲盒图片的meta,json地址,后文会提到
string public notRevealedUri;
//默认地址的扩展类型
string public baseExtension=".json";
mapping(uint256=>string)private _tokenURIs;
//构造器
constructor(string memory initBaseURI,string memory initNotRevealedUri)
ERC721("Nft Meta","NM")//实现了ERC721的父类构造器,是子类继承的一种实现方式
{
setBaseURI(initBaseURI);
setNotRevealedURI(initNotRevealedUri);
}
//外部地址进行铸造nft的函数调用
function mintNftMeta(uint256 tokenQuantity)public payable{
//校验总供应量+每次铸造的数量<=nft的总数量
require(
totalSupply()+tokenQuantity<=MAX_SUPPLY,
"Sale would exceed max supply"
);
//校验是否开启开卖状态
require(_isSaleActive,"Sale must be active to mint NicMetas");
//校验铸造的钱包地址中的nft的数量+本次铸造的数量<=该钱包最大拥有的nft的数量
require(
balanceOf(msg.sender)+tokenQuantity<=maxBalance,
"Sale would exceed max balance"
);
//校验本次铸造的数量*铸造的价格<=本次消息附带的eth的数量
require(
tokenQuantity*mintPrice<=msg.value,
"Not enough ether sent"
);
//校验本次铸造的数量<=本次铸造的最大数量
require(tokenQuantity<=maxMint,"Can only mint 1 tokens at a time");
//以上校验条件满足,进行nft的铸造
_mintNftMeta(tokenQuantity);
}
//进行铸造
function _mintNftMeta(uint256 tokenQuantity)internal{
for(uint256 i=0;i<tokenQuantity;i++){
//mintIndex是铸造nft的序号,按照总供应量从0开始累加
uint256 mintIndex=totalSupply();
if(totalSupply()<MAX_SUPPLY){
//调用erc721的安全铸造方法进行调用
_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"
);
//盲盒还没开启,那么默认是一张黑色背景图片或者其他图片
if(_revealed==false){
return notRevealedUri;
}