Skip to content

Instantly share code, notes, and snippets.

@orbitmechanic
Created March 14, 2021 18:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save orbitmechanic/c751f975cef632ef193dad336c055d39 to your computer and use it in GitHub Desktop.
Save orbitmechanic/c751f975cef632ef193dad336c055d39 to your computer and use it in GitHub Desktop.
pragma solidity ^0.8.0;
// SPDX-License-Identifier: UNLICENSED
contract Kittycontract {
string public constant name = "TestKitties";
string public constant symbol = "TK";
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Birth(
address owner,
uint256 kittenId,
uint256 mumId,
uint256 dadId,
uint256 genes
);
struct Kitty {
uint256 genes;
uint64 birthTime;
uint32 mumId;
uint32 dadId;
uint16 generation;
}
Kitty[] kitties;
mapping (uint256 => address) public kittyIndexToOwner;
mapping (address => uint256) ownershipTokenCount;
mapping (address => uint[]) clowder;
function balanceOf(address owner) external view returns (uint256 balance){
return ownershipTokenCount[owner];
}
function totalSupply() public view returns (uint) {
return kitties.length;
}
function ownerOf(uint256 _tokenId) external view returns (address)
{
return kittyIndexToOwner[_tokenId];
}
function transfer(address _to,uint256 _tokenId) external
{
require(_to != address(0));
require(_to != address(this));
require(_owns(msg.sender, _tokenId));
_transfer(msg.sender, _to, _tokenId);
}
function getAllCatsFor(address _owner) external view returns (uint[] memory cats){
return clowder[_owner];
}
function createKittyGen0(uint256 _genes) public returns (uint256) {
return _createKitty(0, 0, 0, _genes, msg.sender);
}
function _createKitty(
uint256 _mumId,
uint256 _dadId,
uint256 _generation,
uint256 _genes,
address _owner
) private returns (uint256) {
Kitty memory _kitty = Kitty({
genes: _genes,
birthTime: uint64(block.timestamp),
mumId: uint32(_mumId),
dadId: uint32(_dadId),
generation: uint16(_generation)
});
kitties.push(_kitty);
uint256 newKittenId = kitties.length - 1;
emit Birth(_owner, newKittenId, _mumId, _dadId, _genes);
_transfer(address(0), _owner, newKittenId);
return newKittenId;
}
function _transfer(address _from, address _to, uint256 _tokenId) internal {
bool found = false;
ownershipTokenCount[_to]++;
kittyIndexToOwner[_tokenId] = _to;
clowder[_to].push(_tokenId);
if (_from != address(0)) {
ownershipTokenCount[_from]--;
for (uint i = 0; i < clowder[_from].length; i++) {
if (clowder[_from][i] == _tokenId) {
clowder[_from][i] = clowder[_from][clowder[_from].length - 1];
clowder[_from].pop();
found = true;
}
}
require(found == true, "Did not find transferred kitty in giving owner's clowder.");
}
// Emit the transfer event.
emit Transfer(_from, _to, _tokenId);
}
function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
return kittyIndexToOwner[_tokenId] == _claimant;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment