//Write your own contracts here. Currently compiles using solc v0.4.15+commit.bbb8e64f. pragma solidity ^0.4.19; contract AccessControl{ address public ceoAddress; address public cfoAddress; address public cooAddress; bool public paused = false; modifier onlyCEO(){ require(msg.sender == ceoAddress); _; } modifier onlyCFO(){ require(msg.sender == cfoAddress); _; } modifier onlyCOO() { require(msg.sender == cooAddress); _; } modifier onlyCLevel(){ require( msg.sender == cooAddress || msg.sender == ceoAddress || msg.sender == cfoAddress ); _; } function setCFO(address _newCFO) external onlyCEO { require(_newCFO != address(0)); cfoAddress = _newCFO; } function setCOO(address _newCOO) external onlyCEO { require(_newCOO != address(0)); cooAddress = _newCOO; } function setCEO(address _newCEO) external onlyCEO{ require(_newCEO != address(0)); ceoAddress = _newCEO; } modifier whenNotPaused(){ require(!paused); _; } modifier whenPaused(){ require(paused); _; } function pause() external onlyCLevel whenNotPaused{ paused = true; } function unpause() public onlyCEO whenPaused{ paused = false; } } contract Ownable{ address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); OwnershipTransferred(owner, newOwner); owner = newOwner; } } contract CharacterFactory is AccessControl, Ownable{ /*CryptoKitties*/ //event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes); event NewCharacter(uint characterId, string name, uint dna); uint dnaDigits = 16; uint dnaModulus = 10 ** dnaDigits; /*TODO: repensar neste tempo*/ uint cooldownTime = 1 days; struct Character{ string name; uint dna; uint32 level; uint32 readyTime; /*TODO: repensar nas proximas variaveis*/ uint16 winCount; uint16 lossCount; } Character[] public characters; mapping(uint => address) public characterToOwner; mapping(address => uint) ownerCharacterCount; function _createCharacter(string _name, uint _dna) internal{ uint id = characters.push(Character(_name, _dna, /*TODO: look at this*/ 1, uint32(now + cooldownTime), 0, 0)) - 1; characterToOwner[id] = msg.sender; ownerCharacterCount[msg.sender]++; NewCharacter(id, _name, _dna); } /*TODO: este randDna tem problemas de seguranca. rever isto*/ function _generateRandomDna(string _str) private view returns (uint){ uint rand = uint(keccak256(_str)); return rand % dnaModulus; } function createRandomCharacter(string _name) public{ require(ownerCharacterCount[msg.sender] == 0); uint randDna = _generateRandomDna(_name); randDna = randDna - randDna % 100; _createCharacter(_name, randDna); } } contract CharacterInterface{ function getCharacter(uint256 _id) external view returns( bool isGestating, bool isReady, uint256 cooldownIndex, uint256 nextActionAt, uint256 siringWithId, uint256 birthTime, uint256 matronId, uint256 sireId, uint256 generation, uint256 genes ); } contract CharacterFeeding is CharacterFactory{ CharacterInterface characterContract; modifier ownerOf(uint _characterId){ require(msg.sender == characterToOwner[_characterId]); _; } function setCharacterContractAddress(address _address) external onlyOwner{ characterContract = CharacterInterface(_address); } function _triggerCooldown(Character storage _character) internal { _character.readyTime = uint32(now + cooldownTime); } function _isReady(Character storage _character) internal view returns(bool){ return(_character.readyTime <= now); } function feedAndMultiply(uint _characterId, uint _targetDna, string _species) internal ownerOf(_characterId){ Character storage myChar = characters[_characterId]; require(_isReady(myChar)); _targetDna = _targetDna % dnaModulus; uint newDna = (myChar.dna + _targetDna) / 2; if(keccak256(_species) == keccak256("original")){ newDna = newDna - newDna % 100 + 99; } _createCharacter("NoName", newDna); _triggerCooldown(myChar); } function cloningMachine(uint _mainCharId, uint _otherCharId) public{ uint characterDna; (,,,,,,,,,characterDna) = characterContract.getCharacter(_otherCharId); /*TODO: olhar para isto*/ feedAndMultiply(_mainCharId, _otherCharId, "original"); } }
0.4.19