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);

  }

  }

相关文章
|
7月前
|
前端开发 JavaScript 开发者
水墨代码:前端川的诞生——在夏日阴雨中启航
【前端川】网站于农历五月初一(2024年6月6日)上线,融合水墨画与现代前端技术,呈现独特的水墨代码美学。创建者陈川分享技术心得与实战经验,网站特色包括水墨风格界面、技术深度解析及实战案例。在夏日雨中启航,"前端川"致力于为开发者提供灵感与帮助,探索前端技术的无限可能。
113 17
|
8月前
|
自然语言处理 前端开发 测试技术
我在阿里做开发的高效打工技巧总结
如何高效打工?本文作者站在开发的视角总结了一些打工技巧,包括如何高效开会、如何与人沟通、如何做PM等,希望可以给大家提供一些帮助。
mqc
|
缓存 安全 Java
测试之道--阿里巴巴八年测试专家倾情奉献
我从事测试工作将近八年了,从起初的不懂测试,怀疑测试,到相信测试,再到坚定测试,其中经历的辛酸、煎熬无法言表。在从事测试工作的这八年里,有人质疑,也有人追捧,唇枪舌剑,没完没了,貌似测试永远都是个站在舆论风口浪尖的角色。
mqc
8292 0
|
8月前
|
负载均衡 Kubernetes 数据库
【鹅厂摸鱼日记(一)】(工作篇)认识八大技术架构
【鹅厂摸鱼日记(一)】(工作篇)认识八大技术架构
|
8月前
|
新零售 搜索推荐 UED
九星创客互助排位系统开发|技术成熟|源码搭建
新零售模式是一种融合线上、线下商业以及物流,打破传统零售业的边界,通过技术创新和数据驱动来改善用户体验和效率的零售模式。
|
存储 数据采集 数据可视化
低代码烂大街了?不,低代码已然普及! by 彭文华
低代码烂大街了?不,低代码已然普及! by 彭文华
【码上公益-低代码挑战二期】招募爱心极客志愿者!~~
码上公益招募爱心极客,应用宜搭低代码等技术,为公益组织完成公益项目的技术需求。
1521 2
【码上公益-低代码挑战二期】招募爱心极客志愿者!~~
|
存储 监控 IDE
年终力荐:网易一站式的自动化测试解决方案
年终力荐:网易一站式的自动化测试解决方案
465 0
|
Linux 开发者 Python
大四在校学生使用体验
作为一名自动化专业学生,可以说服务器方面知识相当缺乏,但是在开发者社区和官方免费课程的帮助下,可以很好的使用阿里云的云服务器产品。
|
人工智能 移动开发 运维
在线教学战“疫”打响,VIPKID背后是阿里云
庚子年至,疫情肆虐。全国范围内线下教学工作全线停摆,学生由线下涌至线上,线上流量激增,在线授课模式进一步渗透下沉市场。阿里云助力 VIPKID 云端课堂解决全球网络互通和优化,实现流畅教学,共同探索人工智能在线教育的未来。知识不会被疫情隔离,在线教育让因材施教成为可能。
在线教学战“疫”打响,VIPKID背后是阿里云