#
# 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