欢迎光临散文网 会员登陆 & 注册

NFT卡牌盲盒系统开发(开发案例)丨NFT卡牌盲盒开发源码详情

2023-07-08 09:59 作者:bili_36625761919  | 我要投稿

作为一种可能的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;


  }


NFT卡牌盲盒系统开发(开发案例)丨NFT卡牌盲盒开发源码详情的评论 (共 条)

分享到微博请遵守国家法律