# # Eveem.org 26 Apr 2019 # Decompiled source of 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d # # Let's make the world open source # const name = 'CryptoKitties' const symbol = 'CK' const GEN0_STARTING_PRICE = 10^16 const GEN0_AUCTION_DURATION = (24 * 3600) const GEN0_CREATION_LIMIT = 45000 const PROMO_CREATION_LIMIT = 5000 def storage: ceoAddress is addr at storage 0 cfoAddress is addr at storage 1 cooAddress is addr at storage 2 paused is uint8 at storage 2 offset 160 cooldowns is array of uint32 at storage 3 secondsPerBlock is uint256 at storage 5 kitty is array of struct at storage 6 kittyIndexToOwner is mapping of addr at storage 7 balanceOf is mapping of uint256 at storage 8 kittyIndexToApproved is mapping of addr at storage 9 sireAllowedTo is mapping of addr at storage 10 saleAuctionAddress is addr at storage 11 siringAuctionAddress is addr at storage 12 erc721MetadataAddress is addr at storage 13 autoBirthFee is uint256 at storage 14 pregnantKitties is uint256 at storage 15 geneScienceAddress is addr at storage 16 promoCreatedCount is uint256 at storage 17 gen0CreatedCount is uint256 at storage 18 newContractAddress is addr at storage 19 def cfoAddress(): # not payable return cfoAddress def promoCreatedCount(): # not payable return promoCreatedCount def ceoAddress(): # not payable return ceoAddress def pregnantKitties(): # not payable return pregnantKitties def isPregnant(uint256 _horseId): # not payable require _horseId > 0 require _horseId < kitty.length return bool(kitty[_horseId].field_448) def siringAuction(): # not payable return siringAuctionAddress def sireAllowedToAddress(uint256 _param1): # not payable return sireAllowedTo[_param1] def kittyIndexToApproved(uint256 _param1): # not payable return kittyIndexToApproved[_param1] def paused(): # not payable return bool(paused) def ownerOf(uint256 _tokenId): # not payable require kittyIndexToOwner[_tokenId] return kittyIndexToOwner[_tokenId] def newContractAddress(): # not payable return newContractAddress def balanceOf(address _owner): # not payable return balanceOf[addr(_owner)] def secondsPerBlock(): # not payable return secondsPerBlock def cooldowns(uint256 _param1): # not payable require _param1 < 14 return cooldowns[uint8(_param1)] def kittyIndexToOwner(uint256 _param1): # not payable return kittyIndexToOwner[_param1] def cooAddress(): # not payable return cooAddress def autoBirthFee(): # not payable return autoBirthFee def erc721Metadata(): # not payable return erc721MetadataAddress def saleAuction(): # not payable return saleAuctionAddress def getKitty(uint256 _tokenId): # not payable require _tokenId < kitty.length return kitty[_tokenId].field_448 != 0, kitty[_tokenId].field_320 <= block.number, kitty[_tokenId].field_256, kitty[_tokenId].field_256, kitty[_tokenId].field_448, kitty[_tokenId].field_256, kitty[_tokenId].field_256, kitty[_tokenId].field_256, kitty[_tokenId].field_256, kitty[_tokenId].field_0 def gen0CreatedCount(): # not payable return gen0CreatedCount def geneScience(): # not payable return geneScienceAddress # # Regular functions # def totalSupply(): # not payable return (kitty.length - 1) def setAutoBirthFee(uint256 _val): # not payable require cooAddress == caller autoBirthFee = _val def _fallback() payable: # default function if saleAuctionAddress != caller: require siringAuctionAddress == caller def setCEO(address _newCEO): # not payable require ceoAddress == caller require _newCEO ceoAddress = _newCEO def setCOO(address _newCOO): # not payable require ceoAddress == caller require _newCOO cooAddress = _newCOO def setCFO(address _newCFO): # not payable require ceoAddress == caller require _newCFO cfoAddress = _newCFO def setMetadataAddress(address _contractAddress): # not payable require ceoAddress == caller erc721MetadataAddress = _contractAddress def pause(): # not payable if cooAddress != caller: if ceoAddress != caller: require cfoAddress == caller require not paused paused = 1 def setNewAddress(address _v2Address): # not payable require ceoAddress == caller require paused newContractAddress = _v2Address log ContractUpgrade(address newContract=_v2Address) def approveSiring(address _addr, uint256 _sireId): # not payable require not paused require kittyIndexToOwner[_sireId] == caller sireAllowedTo[_sireId] = _addr def setSecondsPerBlock(uint256 _secs): # not payable if cooAddress != caller: if ceoAddress != caller: require cfoAddress == caller require _secs < cooldowns.length secondsPerBlock = _secs def unpause(): # not payable require ceoAddress == caller require paused require saleAuctionAddress require siringAuctionAddress require geneScienceAddress require not newContractAddress require ceoAddress == caller require paused paused = 0 def setGeneScienceAddress(address _address): # not payable require ceoAddress == caller require ext_code.size(_address) call _address.isGeneScience() with: gas gas_remaining - 710 wei require ext_call.success require ext_call.return_data[0] geneScienceAddress = _address def setSaleAuctionAddress(address _address): # not payable require ceoAddress == caller require ext_code.size(_address) call _address.isSaleClockAuction() with: gas gas_remaining - 710 wei require ext_call.success require ext_call.return_data[0] saleAuctionAddress = _address def setSiringAuctionAddress(address _address): # not payable require ceoAddress == caller require ext_code.size(_address) call _address.isSiringClockAuction() with: gas gas_remaining - 710 wei require ext_call.success require ext_call.return_data[0] siringAuctionAddress = _address def withdrawBalance(): # not payable require cfoAddress == caller if eth.balance(this.address) > autoBirthFee + (pregnantKitties * autoBirthFee): call cfoAddress with: value eth.balance(this.address) - autoBirthFee - (pregnantKitties * autoBirthFee) wei gas 2300 * is_zero(value) wei def approve(address _spender, uint256 _value): # not payable require not paused require kittyIndexToOwner[_value] == caller kittyIndexToApproved[_value] = _spender log Approval( address owner=caller, address spender=addr(_spender), uint256 value=_value) def isReadyToBreed(uint256 _tokenId): # not payable require _tokenId > 0 require _tokenId < kitty.length if kitty[_tokenId].field_448: return not bool(kitty[_tokenId].field_256) return kitty[_tokenId].field_256 <= uint64(block.number) def withdrawAuctionBalances(): # not payable if cooAddress != caller: if ceoAddress != caller: require cfoAddress == caller require ext_code.size(saleAuctionAddress) call saleAuctionAddress.withdrawBalance() with: gas gas_remaining - 710 wei require ext_call.success require ext_code.size(siringAuctionAddress) call siringAuctionAddress.withdrawBalance() with: gas gas_remaining - 710 wei require ext_call.success def supportsInterface(bytes4 _interfaceId): # not payable if Mask(32, 224, _interfaceId) == Mask(32, 224, sha3('supportsInterface(bytes4)')): return True return (Mask(32, 224, _interfaceId) == Mask(32, 224, sha3('name()') xor sha3('symbol()') xor sha3('totalSupply()') xor sha3('balanceOf(address)') xor sha3('ownerOf(uint256)') xor sha3('approve(address,uint256)') xor sha3('transfer(address,uint256)') xor sha3('transferFrom(address,address,uin', 't256)') xor sha3('tokensOfOwner(address)') xor sha3('tokenMetadata(uint256,string)'))) def transfer(address _to, uint256 _value): # not payable require not paused require _to require _to != this.address require saleAuctionAddress != _to require siringAuctionAddress != _to require kittyIndexToOwner[_value] == caller balanceOf[addr(_to)]++ kittyIndexToOwner[_value] = _to if caller: balanceOf[caller]-- sireAllowedTo[_value] = 0 kittyIndexToApproved[_value] = 0 log Transfer( address from=caller, address to=addr(_to), uint256 value=_value) def transferFrom(address _from, address _to, uint256 _value): # not payable require not paused require _to require _to != this.address require kittyIndexToApproved[_value] == caller require kittyIndexToOwner[_value] == _from balanceOf[addr(_to)]++ kittyIndexToOwner[_value] = _to if _from: balanceOf[addr(_from)]-- sireAllowedTo[_value] = 0 kittyIndexToApproved[_value] = 0 log Transfer( address from=addr(_from), address to=addr(_to), uint256 value=_value) def createSaleAuction(uint256 _artworkId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration): # not payable require not paused require kittyIndexToOwner[_artworkId] == caller require _artworkId > 0 require _artworkId < kitty.length require not kitty[_artworkId].field_448 kittyIndexToApproved[_artworkId] = saleAuctionAddress require ext_code.size(saleAuctionAddress) call saleAuctionAddress.createAuction(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration, address seller) with: gas gas_remaining - 710 wei args 0, uint32(_artworkId), _startingPrice, _endingPrice, _duration, caller require ext_call.success def createSiringAuction(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration): # not payable require not paused require kittyIndexToOwner[_tokenId] == caller require _tokenId > 0 require _tokenId < kitty.length require not kitty[_tokenId].field_448 require kitty[_tokenId].field_320 <= uint64(block.number) kittyIndexToApproved[_tokenId] = siringAuctionAddress require ext_code.size(siringAuctionAddress) call siringAuctionAddress.createAuction(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration, address seller) with: gas gas_remaining - 710 wei args _tokenId, _startingPrice, _endingPrice, _duration, caller require ext_call.success def tokenMetadata(uint256 _tokenId, string _preferredTransport): # not payable require erc721MetadataAddress mem[356 len _preferredTransport.length] = _preferredTransport[all] require ext_code.size(erc721MetadataAddress) call erc721MetadataAddress.0xcb4799f2 with: gas gas_remaining - 710 wei args _tokenId, Array(len=_preferredTransport.length, data=_preferredTransport[all]) mem[256 len 160] = ext_call.return_data[0 len 160] require ext_call.success mem[416] = 0 mem[448] = 0 _msize = max(124, _preferredTransport.length) mem[_msize + 356] = ext_call.return_data[128] mem[(_msize + 356) + 32 len floor32(ext_call.return_data[128])] = mem[256 len floor32(ext_call.return_data[128])] mem[(_msize + 356) + floor32(ext_call.return_data[128]) + -(ext_call.return_data[128] % 32) + 64 len ext_call.return_data[128] % 32] = mem[floor32(ext_call.return_data[128]) + -(ext_call.return_data[128] % 32) + 288 len ext_call.return_data[128] % 32] return Array(len=ext_call.return_data[128], data=mem[(_msize + 356) + 32 len ext_call.return_data[128]]) def tokensOfOwner(address _owner): # not payable if not balanceOf[addr(_owner)]: return '' idx = 1 s = 0 while idx <= kitty.length - 1: mem[0] = idx mem[32] = 7 if kittyIndexToOwner[idx] != _owner: idx = idx + 1 s = s continue require s < balanceOf[addr(_owner)] mem[(32 * s) + 192] = idx idx = idx + 1 s = s + 1 continue mem[(32 * balanceOf[addr(_owner)]) + 256 len floor32(balanceOf[addr(_owner)])] = mem[192 len floor32(balanceOf[addr(_owner)])] return Array(len=balanceOf[addr(_owner)], data=mem[192 len floor32(balanceOf[addr(_owner)])], mem[(32 * balanceOf[addr(_owner)]) + floor32(balanceOf[addr(_owner)]) + 256 len (32 * balanceOf[addr(_owner)]) - floor32(balanceOf[addr(_owner)])]), def canBreedWith(uint256 _matronId, uint256 _sireId): # not payable require _matronId > 0 require _sireId > 0 require _matronId < kitty.length require _sireId < kitty.length if _matronId == _sireId: return 0 if _sireId == kitty[_matronId].field_384: return 0 if _sireId == kitty[_matronId].field_416: return 0 if _matronId == kitty[_sireId].field_384: return 0 if _matronId == kitty[_sireId].field_416: return 0 if kitty[_sireId].field_384: if kitty[_matronId].field_384: if kitty[_sireId].field_384 == kitty[_matronId].field_384: return 0 if kitty[_matronId].field_416 == kitty[_sireId].field_384: return 0 if kitty[_matronId].field_384 == kitty[_sireId].field_416: return 0 if kitty[_sireId].field_416 == kitty[_matronId].field_416: return 0 if kittyIndexToOwner[_matronId] == kittyIndexToOwner[_sireId]: return True return (kittyIndexToOwner[_matronId] == sireAllowedTo[_sireId]) def createPromoKitty(uint256 _genes, address _owner): # not payable require cooAddress == caller require promoCreatedCount < 5000 promoCreatedCount++ kitty.length++ if not kitty.length <= kitty.length + 1: idx = 2 * kitty.length + 1 while 2 * kitty.length > idx: kitty[idx].field_0 = 0 kitty[idx].field_256 = 0 idx = idx + 2 continue kitty[kitty.length].field_0 = _genes kitty[kitty.length].field_256 = uint64(block.timestamp) kitty[kitty.length].field_320 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_384 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_416 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_448 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_480 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_256 = kitty[kitty.length].field_256 require kitty.length == uint32(kitty.length) if _owner: log Birth( address owner=addr(_owner), uint256 clownId=kitty.length, uint256 matronId=0, uint256 sireId=0, uint256 genes=_genes) balanceOf[addr(_owner)]++ kittyIndexToOwner[stor6.length] = _owner log Transfer( address from=0, address to=addr(_owner), uint256 value=kitty.length) else: log Birth( address owner=cooAddress, uint256 clownId=kitty.length, uint256 matronId=0, uint256 sireId=0, uint256 genes=_genes) balanceOf[stor2]++ kittyIndexToOwner[stor6.length] = cooAddress log Transfer( address from=0, address to=cooAddress, uint256 value=kitty.length) def createGen0Auction(uint256 _pandaId): # not payable require cooAddress == caller require gen0CreatedCount < 45000 kitty.length++ if not kitty.length <= kitty.length + 1: idx = 2 * kitty.length + 1 while 2 * kitty.length > idx: kitty[idx].field_0 = 0 kitty[idx].field_256 = 0 idx = idx + 2 continue kitty[kitty.length].field_0 = _pandaId kitty[kitty.length].field_256 = uint64(block.timestamp) kitty[kitty.length].field_320 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_384 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_416 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_448 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_480 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_256 = kitty[kitty.length].field_256 require kitty.length == uint32(kitty.length) log Birth( address owner=addr(this.address), uint256 clownId=kitty.length, uint256 matronId=0, uint256 sireId=0, uint256 genes=_pandaId) balanceOf[addr(this.address)]++ kittyIndexToOwner[stor6.length] = this.address log Transfer( address from=0, address to=addr(this.address), uint256 value=kitty.length) kittyIndexToApproved[stor6.length] = saleAuctionAddress require ext_code.size(saleAuctionAddress) call saleAuctionAddress.averageGen0SalePrice() with: gas gas_remaining - 710 wei require ext_call.success require ext_call.return_data[0] == ext_call.return_data[16 len 16] require ext_code.size(saleAuctionAddress) if ext_call.return_data[0] + (ext_call.return_data[0] / 2) >= 10^16: call saleAuctionAddress.createAuction(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration, address seller) with: gas gas_remaining - 710 wei args kitty.length, ext_call.return_data[0] + (ext_call.return_data[0] / 2), 0, 24 * 3600, this.address else: call saleAuctionAddress.createAuction(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration, address seller) with: gas gas_remaining - 710 wei args kitty.length, 10^16, 0, 24 * 3600, this.address require ext_call.success gen0CreatedCount++ def breedWithAuto(uint256 _matronId, uint256 _sireId) payable: require not paused require call.value >= autoBirthFee require kittyIndexToOwner[_matronId] == caller if kittyIndexToOwner[_matronId] != kittyIndexToOwner[_sireId]: require kittyIndexToOwner[_matronId] == sireAllowedTo[_sireId] require _matronId < kitty.length require not kitty[_matronId].field_448 require kitty[_matronId].field_320 <= uint64(block.number) require _sireId < kitty.length require not kitty[_sireId].field_448 require kitty[_sireId].field_320 <= uint64(block.number) require _matronId != _sireId require _sireId != kitty[_matronId].field_384 require _sireId != kitty[_matronId].field_416 require _matronId != kitty[_sireId].field_384 require _matronId != kitty[_sireId].field_416 if kitty[_sireId].field_384: if kitty[_matronId].field_384: require kitty[_sireId].field_384 != kitty[_matronId].field_384 require kitty[_matronId].field_416 != kitty[_sireId].field_384 require kitty[_matronId].field_384 != kitty[_sireId].field_416 require kitty[_sireId].field_416 != kitty[_matronId].field_416 require _sireId < kitty.length require _matronId < kitty.length kitty[_matronId].field_448 = uint32(_sireId) require kitty[_sireId].field_480 < 14 require secondsPerBlock kitty[_sireId].field_320 = uint64((cooldowns[stor6[_sireId].field_480] / secondsPerBlock) + block.number) if kitty[_sireId].field_480 < 13: kitty[_sireId].field_480 = uint16(kitty[_sireId].field_480 + 1) require kitty[_matronId].field_480 < 14 require secondsPerBlock kitty[_matronId].field_320 = uint64((cooldowns[stor6[_matronId].field_480] / secondsPerBlock) + block.number) if kitty[_matronId].field_480 < 13: kitty[_matronId].field_480 = uint16(kitty[_matronId].field_480 + 1) sireAllowedTo[_matronId] = 0 sireAllowedTo[_sireId] = 0 pregnantKitties++ log Pregnant( address owner=kittyIndexToOwner[_matronId], uint256 mareId=_matronId, uint256 stallionId=_sireId, uint256 unproductiveEndBlock=kitty[_matronId].field_320) def bidOnSiringAuction(uint256 _sireId, uint256 _matronId) payable: require not paused require kittyIndexToOwner[_matronId] == caller require _matronId > 0 require _matronId < kitty.length require not kitty[_matronId].field_448 require kitty[_matronId].field_320 <= uint64(block.number) require _matronId < kitty.length require _sireId < kitty.length require _matronId != _sireId require _sireId != kitty[_matronId].field_384 require _sireId != kitty[_matronId].field_416 require _matronId != kitty[_sireId].field_384 require _matronId != kitty[_sireId].field_416 if kitty[_sireId].field_384: if kitty[_matronId].field_384: require kitty[_sireId].field_384 != kitty[_matronId].field_384 require kitty[_matronId].field_416 != kitty[_sireId].field_384 require kitty[_matronId].field_384 != kitty[_sireId].field_416 require kitty[_sireId].field_416 != kitty[_matronId].field_416 require ext_code.size(siringAuctionAddress) call siringAuctionAddress.getCurrentPrice(uint256 tokenId) with: gas gas_remaining - 710 wei args _sireId require ext_call.success require call.value >= ext_call.return_data[0] + autoBirthFee require ext_code.size(siringAuctionAddress) call siringAuctionAddress.bid(uint256 tokenId) with: value call.value - autoBirthFee wei gas gas_remaining - 9710 wei args _sireId require ext_call.success require uint32(_sireId) < kitty.length require uint32(_matronId) < kitty.length kitty[2 * uint32(_matronId)].field_448 = uint32(_sireId) require kitty[2 * uint32(_sireId)].field_480 < 14 require secondsPerBlock kitty[2 * uint32(_sireId)].field_320 = uint64((cooldowns[stor6[2 * uint32(_sireId)].field_480] / secondsPerBlock) + block.number) if kitty[2 * uint32(_sireId)].field_480 < 13: kitty[2 * uint32(_sireId)].field_480 = uint16(kitty[2 * uint32(_sireId)].field_480 + 1) require kitty[2 * uint32(_matronId)].field_480 < 14 require secondsPerBlock kitty[2 * uint32(_matronId)].field_320 = uint64((cooldowns[stor6[2 * uint32(_matronId)].field_480] / secondsPerBlock) + block.number) if kitty[2 * uint32(_matronId)].field_480 < 13: kitty[2 * uint32(_matronId)].field_480 = uint16(kitty[2 * uint32(_matronId)].field_480 + 1) sireAllowedTo[_matronId << 224] = 0 sireAllowedTo[uint32(_sireId)] = 0 pregnantKitties++ log Pregnant( address owner=kittyIndexToOwner[_matronId << 224], uint256 mareId=_matronId << 224, uint256 stallionId=_sireId << 224, uint256 unproductiveEndBlock=kitty[2 * uint32(_matronId)].field_320) def giveBirth(uint256 _matronId): # not payable require not paused require _matronId < kitty.length require kitty[_matronId].field_256 require kitty[_matronId].field_448 require kitty[_matronId].field_320 <= uint64(block.number) require kitty[_matronId].field_448 < kitty.length require ext_code.size(geneScienceAddress) call geneScienceAddress.mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) with: gas gas_remaining - 710 wei args kitty[_matronId].field_0, kitty[kitty[_matronId].field_448].field_0, uint64(kitty[_matronId].field_320 - 1) require ext_call.success require _matronId == uint32(_matronId) require kitty[_matronId].field_448 == kitty[_matronId].field_448 if kitty[kitty[_matronId].field_448].field_496 <= kitty[_matronId].field_496: require uint16(kitty[_matronId].field_496 + 1) == uint16(kitty[_matronId].field_496 + 1) kitty.length++ if not kitty.length <= kitty.length + 1: idx = 2 * kitty.length + 1 while 2 * kitty.length > idx: kitty[idx].field_0 = 0 kitty[idx].field_256 = 0 idx = idx + 2 continue kitty[kitty.length].field_0 = ext_call.return_data[0] kitty[kitty.length].field_256 = uint64(block.timestamp) kitty[kitty.length].field_320 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_384 = uint32(_matronId) kitty[kitty.length].field_416 = kitty[_matronId].field_448 kitty[kitty.length].field_448 = 0 kitty[kitty.length].field_512 = 0 if uint16(kitty[_matronId].field_496 + 1) / 2 <= 13: kitty[kitty.length].field_480 = uint16(kitty[_matronId].field_496 + 1) / 2 kitty[kitty.length].field_495 = 0 else: kitty[kitty.length].field_480 = 13 kitty[kitty.length].field_488 = 0 kitty[kitty.length].field_496 = uint16(kitty[_matronId].field_496 + 1) else: require uint16(kitty[kitty[_matronId].field_448].field_496 + 1) == uint16(kitty[kitty[_matronId].field_448].field_496 + 1) kitty.length++ if not kitty.length <= kitty.length + 1: idx = 2 * kitty.length + 1 while 2 * kitty.length > idx: kitty[idx].field_0 = 0 kitty[idx].field_256 = 0 idx = idx + 2 continue kitty[kitty.length].field_0 = ext_call.return_data[0] kitty[kitty.length].field_256 = uint64(block.timestamp) kitty[kitty.length].field_320 = 0 kitty[kitty.length].field_512 = 0 kitty[kitty.length].field_384 = uint32(_matronId) kitty[kitty.length].field_416 = kitty[_matronId].field_448 kitty[kitty.length].field_448 = 0 kitty[kitty.length].field_512 = 0 if uint16(kitty[kitty[_matronId].field_448].field_496 + 1) / 2 <= 13: kitty[kitty.length].field_480 = uint16(kitty[kitty[_matronId].field_448].field_496 + 1) / 2 kitty[kitty.length].field_495 = 0 else: kitty[kitty.length].field_480 = 13 kitty[kitty.length].field_488 = 0 kitty[kitty.length].field_496 = uint16(kitty[kitty[_matronId].field_448].field_496 + 1) require kitty.length == uint32(kitty.length) log Birth( address owner=kittyIndexToOwner[_matronId], uint256 clownId=kitty.length, uint256 matronId=_matronId << 224, uint256 sireId=kitty[_matronId].field_256, uint256 genes=ext_call.return_data[0]) balanceOf[stor7[_matronId]]++ kittyIndexToOwner[stor6.length] = kittyIndexToOwner[_matronId] log Transfer( address from=0, address to=kittyIndexToOwner[_matronId], uint256 value=kitty.length) kitty[_matronId].field_448 = 0 pregnantKitties-- call caller with: value autoBirthFee wei gas 2300 * is_zero(value) wei return kitty.length