加密猫的demo

This commit is contained in:
2022-11-22 14:00:23 +08:00
parent b1ba4a7f4d
commit 6d17e46728
5 changed files with 3832 additions and 0 deletions

30
src/Online/Access.sol Normal file
View File

@@ -0,0 +1,30 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
abstract contract Access is ERC721Pausable, Ownable {
function pause() public virtual onlyOwner {
super._pause();
}
function unpause() public virtual onlyOwner {
super._unpause();
}
/**
* @dev 这个是为了接收ETH转账用的
*/
receive() external payable virtual {}
function withdrawBalance() external onlyOwner {
// uint256 balance = this.balance;
// // Subtract all the currently pregnant kittens we have, plus 1 of margin.
// uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;
// if (balance > subtractFees) {
// cfoAddress.transfer(balance - subtractFees);
// }
}
}

1720
src/Online/CoolKitty.sol Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

57
src/Online/Kitty.sol Normal file
View File

@@ -0,0 +1,57 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./KittyController.sol";
contract HelloKitty is KittyController {
/// 初始化猫
constructor() ERC721("CryptoKitties", "CK") {
_createKitty(0, 0, 0, (2**256) - 1, _msgSender());
}
function _createKitty(
uint256 _matronId,
uint256 _sireId,
uint256 _generation,
uint256 _genes,
address _owner
) internal returns (uint256) {
require(_matronId == uint256(uint32(_matronId)));
require(_sireId == uint256(uint32(_sireId)));
require(_generation == uint256(uint16(_generation)));
// New kitty starts with the same cooldown as parent gen/2
uint16 cooldownIndex = uint16(_generation / 2);
if (cooldownIndex > 13) {
cooldownIndex = 13;
}
Kitty memory _kitty = Kitty({
genes: _genes,
birthTime: uint64(block.timestamp),
cooldownEndBlock: 0,
matronId: uint32(_matronId),
sireId: uint32(_sireId),
siringWithId: 0,
cooldownIndex: cooldownIndex,
generation: uint16(_generation)
});
kitties.push(_kitty);
uint256 newKittenId = 1;
// uint256 newKittenId = kitties.push(_kitty) - 1;
// require(newKittenId == uint256(uint32(newKittenId)));
emit Birth(
_owner,
newKittenId,
uint256(_kitty.matronId),
uint256(_kitty.sireId),
_kitty.genes
);
super._mint(_owner, newKittenId);
return newKittenId;
}
}

View File

@@ -0,0 +1,52 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol";
import "./Access.sol";
abstract contract KittyController is ERC721, Access {
struct Kitty {
// 猫的基因
uint256 genes;
// 出块时间戳
uint64 birthTime;
// 再次繁育冷却时间
uint64 cooldownEndBlock;
// 猫的母系ID
uint32 matronId;
// 父系ID
uint32 sireId;
// 对于怀孕的母猫设置为公猫的ID否则为零。这里的一个非零值是我们如何知道猫怀孕了。用于在出生时检索新小猫的遗传物质。
uint32 siringWithId;
// 每繁殖一次,递增一次,无论公母
uint16 cooldownIndex;
// 世代号(i.e. max(matron.generation, sire.generation) + 1)
uint16 generation;
}
Kitty[] kitties;
event Birth(
address owner,
uint256 kittyId,
uint256 matronId,
uint256 sireId,
uint256 genes
);
function getKitty(uint256 _id) public view returns (Kitty memory) {
return kitties[_id];
}
function _beforeTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual override(ERC721, ERC721Pausable) {
super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
}
}