ProTradex普瑞缇(PRT)开发系统搭建技术

简介: NFT是独一无二的,但它却不是一成不变的。所以NFT是可以成长的,可以通过两个不同的NFT合成一个新的NFT。生成的一个新的NFT,有的自己属性和技能同样继承NFT的属性让NFT实现更多玩法。

  NFT是独一无二的,但它却不是一成不变的。所以NFT是可以成长的,可以通过两个不同的NFT合成一个新的NFT。生成的一个新的NFT,有的自己属性和技能同样继承NFT的属性让NFT实现更多玩法。

  ProTradex目前基于NFT的去中心化杠杆抵押借贷协议,区别于目前市面上的NFT借贷平台,不仅仅允许用户将NFT资源抵押到资金池中,获得U等加密资源,也支持用户将加密资源在协议中抵押。

  项目中,我们初次mint出来的NFT等级是0级,并且它们的创建者也是0,通过两个NFT合成之后创建一个新的NFT,新的NFT等级会+1,并且会继承原NFT的的Id。

  代码实战

  //SPDX-License-Identifier:MIT

  pragma solidity^0.8.9;

  import"openzeppelin/contracts/token/ERC721/ERC721.sol";

  import"openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

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

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

  import"openzeppelin/contracts/utils/Strings.sol";

  import"hardhat/console.sol";

  contract ComposeNFT is ERC721,ERC721Enumerable,ERC721URIStorage{

  using Counters for Counters.Counter;

  using Strings for uint256;

  Counters.Counter private _tokenIdCounter;

  struct Donkey{

  address owner;

  uint tokenId;

  uint8 level;

  uint dadId;//父

  uint mumId;//母

  string uri;

  }

  Donkey[]public donkeys;

  constructor()ERC721("Donkeys NFT","DONKEYS"){

  }

  function _baseURI()internal pure override returns(string memory){

  return"https://raw.githubusercontent.com/qdwds/NFT-metadata/master/metadata/donkeys/";

  }

  function _setURI(uint256 _level)internal view returns(string memory uri){

  uint random=_random(100)+1;

  uri=string(abi.encodePacked(_level.toString(),"/images/",random.toString(),".png"));

  }

  function _random(uint _max)internal view returns(uint256){

  uint256 random=uint256(keccak256(abi.encodePacked(msg.sender,block.timestamp,block.coinbase,gasleft())));

  return(random>block.number)?(random-block.number)%_max:(block.number-random)%_max;

  }

  function safeMint(address _to)public{

  _innerMint(_to,0,0,0);

  }

  function batchSafeMint(address _to,uint8 _numWords)public{

  require(_numWords<=100,"MAX mint 10");

  for(uint i=0;i<_numWords;i++){

  _innerMint(_to,0,0,0);

  }

  }

  function _innerMint(address _to,uint8 _level,uint256 _dadId,uint256 _mumId)internal{

  uint256 tokenId=_tokenIdCounter.current();

  _tokenIdCounter.increment();

  string memory uri=string(abi.encodePacked(_baseURI(),_setURI(_level)));

  Donkey memory donkey=Donkey({

  owner:_to,

  tokenId:tokenId,

  level:_level,

  mumId:_mumId,

  dadId:_dadId,

  uri:uri

  });

  donkeys.push(donkey);

  _safeMint(_to,tokenId);

  _setTokenURI(tokenId,uri);

  }

  function getDonkey(uint256 _tokenId)public view returns(Donkey memory donkey){

  donkey=donkeys[_tokenId];

  }

  function getDonkeys(address _owner)public view returns(Donkey[]memory ownerDonkeys){

  uint balance=balanceOf(_owner);

  ownerDonkeys=new Donkey[](balance);

  for(uint256 i=0;i<balance;i++){

  uint index=tokenOfOwnerByIndex(_owner,i);

  ownerDonkeys<i>=donkeys[index];

  }

  }

  function breed(uint256 _dadId,uint256 _mumId)public{

  Donkey memory dad=donkeys[_dadId];

  Donkey memory mum=donkeys[_mumId];

  require(dad.owner==msg.sender&&mum.owner==msg.sender,"Pass?");

  require(dad.level==mum.level,"level fild");

  require(dad.level<3,"Create MAX level 3");

  _innerMint(msg.sender,dad.level+1,dad.tokenId,mum.tokenId);

  }

  //The following functions are overrides required by Solidity.

  function _beforeTokenTransfer(address from,address to,uint256 tokenId,uint256 batchSize)

  internal

  override(ERC721,ERC721Enumerable)

  {

  super._beforeTokenTransfer(from,to,tokenId,batchSize);

  }

  function _burn(uint256 tokenId)internal override(ERC721,ERC721URIStorage){

  super._burn(tokenId);

  }

  function tokenURI(uint256 tokenId)

  public

  view

  override(ERC721,ERC721URIStorage)

  returns(string memory)

  {

  return super.tokenURI(tokenId);

  }

  function supportsInterface(bytes4 interfaceId)

  public

  view

  override(ERC721,ERC721Enumerable)

  returns(bool)

  {

  return super.supportsInterface(interfaceId);

  }

  }

相关文章
|
搜索推荐 大数据 数据处理
如何甄选出一个优秀的软件供应商?by彭文华
如何甄选出一个优秀的软件供应商?by彭文华
高效团队的实战-自如OKR实景 | 彭文华
高效团队的实战-自如OKR实景 | 彭文华
|
3月前
|
开发工具 Android开发 iOS开发
多端开发围炉夜话
多端开发围炉夜话
31 12
|
SQL 数据可视化 搜索推荐
咚咚咚,穷人版生产力工具,好用到飞起
咚咚咚,穷人版生产力工具,好用到飞起
|
人工智能 移动开发 搜索推荐
祝贺!中华保险新一代车险系统正式上线
祝贺!中华保险新一代车险系统正式上线
223 0
|
安全 区块链 开发者
ProTradex普瑞缇智能合约PRT分红系统开发(详细及玩法)丨ProTradex普瑞缇智能合约PRT分红开发源码说明
  简而言之,如果一个区块的交易信息被改变,那么该区块体、区块的哈希值也将被改变,该区块之后区块的哈希值也将被改变。如果想让后面的区块还能连接到它后面所有的区块必须全部同时修改,否则被改之后的区块就全部脱离了区块链。
|
区块链 vr&ar 开发工具
ProTradex(普瑞缇)智能合约开发案例
Source code WeChat:kaifa873
154 0
|
区块链 vr&ar 开发工具
ProTradex(普瑞缇)智能合约开发运营版丨普瑞缇ProTradex智能合约系统开发(开发案例)
  智能合约dapp开发技术是一种基于区块链技术的开发技术,它可以帮助开发者快速高效地开发出功能强大、可靠性高的dapp(去中心化应用)。
|
人工智能 算法 PyTorch
原力元宇宙Metaforce/Forsage/佛萨奇2.0系统开发(开发详情),原力元宇宙Metaforce/Forsage/佛萨奇2.0系统源码部署
 去中心化是与中心化相对的一个概念,在一个中心化的系统中,其它的节点必须依赖中心才能生存,中心决定了节点。在一个去中心化的系统中,分布有众多的节点,每个节点都具有高度自治的特征,每一个节点都是一个“小中心”。
|
JSON 小程序 JavaScript
【小程序 | 启航篇】一文打通任督二脉
【小程序 | 启航篇】一文打通任督二脉
【小程序 | 启航篇】一文打通任督二脉