BoredApeYachtClub 无聊猿-NFT 源码解析第一节
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 源码解析第一节相关推荐
- AFL-Fuzz源码解析第一部分:afl-gcc代码插桩
先看afl-gcc的实现 当调用afl-g++或afl-gcc对目标代码进行插桩编译时,首先调用g++或gcc对目前程序进行编译, 如下,通过cc_params[0]指定编译器 if (!strcmp ...
- jQuery源码解析(架构与依赖模块)第一章 理解架构
1-1 jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, F ...
- 大数据Spark “蘑菇云”行动第103课:Hive源码大师之路第一步:Hive源码思考和解析初体验
大数据Spark "蘑菇云"行动第103课:Hive源码大师之路第一步:Hive源码思考和解析初体验 老师上课使用的Hive源码下载地址:http://www-eu.apache. ...
- 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-evict/ ...
- Spring Boot Profile使用详解及配置源码解析
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 二师兄 来源 | 程序新视界 在实践的过程中我 ...
- Go源码解析——Channel篇
channel.map.slice作为golang的核心三剑客,对于使用golang作为主语言完成开发工作的程序猿来说是非常重要的.了解其设计和源码是使用的基础,因此笔者本专题会对这三种数据结构的源码 ...
- Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(四)
Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(四) 3. Joint optimization 3.3 IMU preintegrat ...
- [源码解析] 从TimeoutException看Flink的心跳机制
[源码解析] 从TimeoutException看Flink的心跳机制 文章目录 [源码解析] 从TimeoutException看Flink的心跳机制 0x00 摘要 0x01 缘由 0x02 背景 ...
- Eureka 源码解析 —— EndPoint 与 解析器
1. 概述 本文主要分享 EndPoint 与 解析器. EndPoint ,服务端点.例如,Eureka-Server 的访问地址. EndPoint 解析器,将配置的 Eureka-Server ...
最新文章
- 12c双机rac oracle_深度干货 | 如何借助云原生搞定Oracle备份快速恢复?
- socket(套接字)详解一种通讯机制
- Android UI(三)SlidingMenu实现滑动菜单(详细 官方)
- Redis异步消息队列
- .Net框架集WebClient类向WinCE平台上传文件(FTP方式)延迟15秒释疑
- 吸顶灯怎么固定天花板_什么是吸顶灯?吸顶灯的材质和其与吊顶灯的区别分析...
- hdu1558计算几何加并查集
- java io装饰类,Java IO 装饰类新说
- 迪杰斯特拉算法dijkstra(可打印最短路径)
- 单播/组播/广播 通讯协议的特点及应用对比
- 最新超详细VMware虚拟机下载与安装
- 网页端Excel开发与设计
- 修复网络未知依赖服务器,Win7无法上网提示“未知 依赖服务或组无法启动”是什么原因 修改网络配置的三种方法...
- 织梦php集成环境安装包,常用PHP运行环境一键安装包
- bug引发的惨案,拼多多100元话费只需4毛钱,损失上千亿……
- Github(Life Restart作者)新作:生火间 网址
- 华为的“少年天才”攀登者,出发向智能存储的“奥林帕斯山”
- 面试指导:情景处理与应变题常见问题
- isolinux.cfg配置文件的写法
- Android 模拟器硬件加速
热门文章
- Failed to load resource: the server responded with a status of 413 (Request Entity Too Large)
- latex并排显示多个图片
- thinkpad E430 电源连接未充电的问题解决方法
- 3G门户手机浏览器试用感受
- 海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件mp4
- Java:JSON扁平化和去扁平化
- 人——Web3的新平台
- LayoutInflate: Avoid passing null as the view root
- 表字段的处理(Sql Server)
- DRV8824,DRV8825新的解决方案