BoredApeYachtClub 无聊猿

BoredApeYachtClub无聊猿NFT智能合约包含多个contract:

首先来看 contract BoredApeYachtClub:该合约继承ERC721以及Ownable 合约,是无聊猿NFT的主体合约。

    //BAYC起源地string public BAYC_PROVENANCE = "";//起始区块位置,用于记录合约起始的区块值 block.numberuint256 public startingIndexBlock;//起始编号 uint256 public startingIndex;// 铸造每个APE 最小单位费用uint256 public constant apePrice = 80000000000000000; //0.08 ETH//每次最大铸造数量20uint public constant maxApePurchase = 20;//最大的数量uint256 public MAX_APES;//是否可出售状态bool public saleIsActive = false;//可铸造的时间uint256 public REVEAL_TIMESTAMP;//构造函数,智能合约创建时,进行初始化。由于本合约继承了ERC721 所以初始化ERC721的构造函数  Ownable是抽象类abstract 则不需要constructor(string memory name, string memory symbol, uint256 maxNftSupply, uint256 saleStart) ERC721(name, symbol) {//设置最大供应量MAX_APES = maxNftSupply;//设置可mint时间,mint时间必须大于等于REVEAL_TIMESTAMPREVEAL_TIMESTAMP = saleStart + (86400 * 9);}// withdraw函数 返还地址的以太坊// onlyOwner 只允许合约部署地址调用该方法// payable 表示该方法能够使用transfer 和 send 发送以太坊 function withdraw() public onlyOwner payable {//获取当前合约账户余额 uint balance = address(this).balance;//发送wei 到 msg.sender地址msg.sender.transfer(balance);}/*** Set some Bored Apes aside* 获取一些新的ape NFT 这里给定该方法每次生成30个新BAYC*/function reserveApes() public onlyOwner {        //获取当前总供给量uint supply = totalSupply();//mint 30个新的BAYCuint i;for (i = 0; i < 30; i++) {_safeMint(msg.sender, supply + i);}}/*** DM Gargamel in Discord that you're standing right behind him.*设置可铸造时间  *onlyOwner 只允许合约部署地址调用该方法*/function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner {REVEAL_TIMESTAMP = revealTimeStamp;} /*     * Set provenance once it's calculated* 设置起源地HASH值*/function setProvenanceHash(string memory provenanceHash) public onlyOwner {BAYC_PROVENANCE = provenanceHash;}/**设置URL */function setBaseURI(string memory baseURI) public onlyOwner {_setBaseURI(baseURI);}/** Pause sale if active, make active if paused* 改变可售卖状态  * onlyOwner 只允许合约部署地址调用该方法*/function flipSaleState() public onlyOwner {saleIsActive = !saleIsActive;}/*** Mints Bored Apes* 铸造 APE NFT*/function mintApe(uint numberOfTokens) public payable {// 售卖状态需要开启require(saleIsActive, "Sale must be active to mint Ape");// 铸造数量必须小于等于20require(numberOfTokens <= maxApePurchase, "Can only mint 20 tokens at a time");// 增加铸造的数量必须小于 MAX_APEsrequire(totalSupply().add(numberOfTokens) <= MAX_APES, "Purchase would exceed max supply of Apes");// 发送的以太坊 >= numberOfTokens * 0.08ETHrequire(apePrice.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");//铸造对应数量的APEfor(uint i = 0; i < numberOfTokens; i++) {//获取总供应量 该方法继承于 ERC721 合约uint mintIndex = totalSupply();if (totalSupply() < MAX_APES) {//铸造BAYC msg.sender铸造者地址,mintIndex 铸造的BAYC的tokenId 该方法继承于 ERC721 合约_safeMint(msg.sender, mintIndex);}}// If we haven't set the starting index and this is either 1) the last saleable token or 2) the first token to be sold after// the end of pre-sale, set the starting index blockif (startingIndexBlock == 0 && (totalSupply() == MAX_APES || block.timestamp >= REVEAL_TIMESTAMP)) {startingIndexBlock = block.number;} }/*** Set the starting index for the collection* 设置对应的起始编号*/function setStartingIndex() public {//起始编号为0  表示还没有被设置过require(startingIndex == 0, "Starting index is already set");// 起始区块的位置需要已经被设置require(startingIndexBlock != 0, "Starting index block must be set");//计算起始编号的值startingIndex = uint(blockhash(startingIndexBlock)) % MAX_APES;// Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)// 最坏的情况下如果这个函数调用的太晚了  就用下面的方式计算起始编号的值if (block.number.sub(startingIndexBlock) > 255) {startingIndex = uint(blockhash(block.number - 1)) % MAX_APES;}// Prevent default sequenceif (startingIndex == 0) {startingIndex = startingIndex.add(1);}}/*** Set the starting index block for the collection, essentially unblocking* setting starting index*设置起始块值*/function emergencySetStartingIndexBlock() public onlyOwner {require(startingIndex == 0, "Starting index is already set");startingIndexBlock = block.number;}
}

BoredApeYachtClub 无聊猿-NFT 源码解析第一节相关推荐

  1. AFL-Fuzz源码解析第一部分:afl-gcc代码插桩

    先看afl-gcc的实现 当调用afl-g++或afl-gcc对目标代码进行插桩编译时,首先调用g++或gcc对目前程序进行编译, 如下,通过cc_params[0]指定编译器 if (!strcmp ...

  2. jQuery源码解析(架构与依赖模块)第一章 理解架构

    1-1 jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, F ...

  3. 大数据Spark “蘑菇云”行动第103课:Hive源码大师之路第一步:Hive源码思考和解析初体验

    大数据Spark "蘑菇云"行动第103课:Hive源码大师之路第一步:Hive源码思考和解析初体验 老师上课使用的Hive源码下载地址:http://www-eu.apache. ...

  4. 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-evict/ ...

  5. Spring Boot Profile使用详解及配置源码解析

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 二师兄 来源 | 程序新视界 在实践的过程中我 ...

  6. Go源码解析——Channel篇

    channel.map.slice作为golang的核心三剑客,对于使用golang作为主语言完成开发工作的程序猿来说是非常重要的.了解其设计和源码是使用的基础,因此笔者本专题会对这三种数据结构的源码 ...

  7. Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(四)

    Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(四) 3. Joint optimization 3.3 IMU preintegrat ...

  8. [源码解析] 从TimeoutException看Flink的心跳机制

    [源码解析] 从TimeoutException看Flink的心跳机制 文章目录 [源码解析] 从TimeoutException看Flink的心跳机制 0x00 摘要 0x01 缘由 0x02 背景 ...

  9. Eureka 源码解析 —— EndPoint 与 解析器

    1. 概述 本文主要分享 EndPoint 与 解析器. EndPoint ,服务端点.例如,Eureka-Server 的访问地址. EndPoint 解析器,将配置的 Eureka-Server ...

最新文章

  1. 12c双机rac oracle_深度干货 | 如何借助云原生搞定Oracle备份快速恢复?
  2. socket(套接字)详解一种通讯机制
  3. Android UI(三)SlidingMenu实现滑动菜单(详细 官方)
  4. Redis异步消息队列
  5. .Net框架集WebClient类向WinCE平台上传文件(FTP方式)延迟15秒释疑
  6. 吸顶灯怎么固定天花板_什么是吸顶灯?吸顶灯的材质和其与吊顶灯的区别分析...
  7. hdu1558计算几何加并查集
  8. java io装饰类,Java IO 装饰类新说
  9. 迪杰斯特拉算法dijkstra(可打印最短路径)
  10. 单播/组播/广播 通讯协议的特点及应用对比
  11. 最新超详细VMware虚拟机下载与安装
  12. 网页端Excel开发与设计
  13. 修复网络未知依赖服务器,Win7无法上网提示“未知 依赖服务或组无法启动”是什么原因 修改网络配置的三种方法...
  14. 织梦php集成环境安装包,常用PHP运行环境一键安装包
  15. bug引发的惨案,拼多多100元话费只需4毛钱,损失上千亿……
  16. Github(Life Restart作者)新作:生火间 网址
  17. 华为的“少年天才”攀登者,出发向智能存储的“奥林帕斯山”
  18. 面试指导:情景处理与应变题常见问题
  19. isolinux.cfg配置文件的写法
  20. Android 模拟器硬件加速

热门文章

  1. Failed to load resource: the server responded with a status of 413 (Request Entity Too Large)
  2. latex并排显示多个图片
  3. thinkpad E430 电源连接未充电的问题解决方法
  4. 3G门户手机浏览器试用感受
  5. 海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件mp4
  6. Java:JSON扁平化和去扁平化
  7. 人——Web3的新平台
  8. LayoutInflate: Avoid passing null as the view root
  9. 表字段的处理(Sql Server)
  10. DRV8824,DRV8825新的解决方案