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

  }

  }

相关文章
|
机器学习/深度学习 Ubuntu Shell
在Ubuntu 18.04上安装Anaconda
在Ubuntu 18.04上安装Anaconda
785 1
|
存储 监控 网络协议
AnaTraf全流量分析系统基本功能
全流量分析系统是一种强大的网络监控与分析工具,可捕获、分析并存储网络中的所有流量。AnaTraf系统支持多种部署方式(桥接、镜像、TAP),确保不干扰现有网络架构,同时提供SSL加密保障数据安全传输。系统具备虚拟链路分析、循环存储、过滤捕获等功能,支持数据包回放和协议解码识别,助力深入分析。丰富的统计功能涵盖TOP N仪表板、MAC/ARP/VLAN分析等,同时集成威胁情报检测和溯源能力,强化网络安全防护。通过用户管理和访问控制,系统实现精细化管理,为网络性能优化与安全保障提供关键支持。
|
人工智能 数据挖掘 大数据
538个代码示例!麻省理工教授的Python程序设计+人工智能案例实践
Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。 此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面有广泛应用。 尤其是在数据分析和人工智能方面,Python已成为最受开发者欢迎的编程语言之一,不仅大量计算机专业人员选择使用Python进行快速开发,许多非计算机专业人员也纷纷选择Python语言来解决专业问题。 由于Python应用广泛,关于Python的参考书目前已经有很多,但将Python编程与数据分析、人工智
|
存储 监控 Apache
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
网易的灵犀办公和云信利用 Apache Doris 改进了大规模日志和时序数据处理,取代了 Elasticsearch 和 InfluxDB。Doris 实现了更低的服务器资源消耗和更高的查询性能,相比 Elasticsearch,查询速度提升至少 11 倍,存储资源节省达 70%。Doris 的列式存储、高压缩比和倒排索引等功能,优化了日志和时序数据的存储与分析,降低了存储成本并提高了查询效率。在灵犀办公和云信的实际应用中,Doris 显示出显著的性能优势,成功应对了数据增长带来的挑战。
54220 2
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
|
存储 缓存 自然语言处理
(三)JVM成神路之全面详解执行引擎子系统、JIT即时编译原理与分派实现
执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于“物理机”的概念,与物理机一样,都具备代码执行的能力。
713 1
|
缓存 Java 数据库连接
【Mybatis】说一下 mybatis 的一级缓存和二级缓存
【Mybatis】说一下 mybatis 的一级缓存和二级缓存
|
消息中间件 关系型数据库 MySQL
使用Flink实现MySQL到Kafka的数据流转换
使用Flink实现MySQL到Kafka的数据流转换
458 0
|
小程序 JavaScript
小程序一个页面调用多个号码的手机拨号功能
小程序一个页面调用多个号码的手机拨号功能
581 0
|
机器学习/深度学习 算法 PyTorch
深度学习炼丹-超参数设定和模型训练
所谓超参数,即不是通过学习算法本身学习出来的,需要作者手动调整(可优化参数)的参数(理论上我们也可以设计一个嵌套的学习过程,一个学习算法为另一个学习算法学出最优超参数),卷积神经网络中常见的超参数有: 优化器学习率、训练 Epochs 数、批次大小 batch_size 、输入图像尺寸大小。
2930 0
深度学习炼丹-超参数设定和模型训练

热门文章

最新文章