Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 9463 txns
Token Tracker: CryptoFlowers (CF)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xeee5443ecf75dcc7a06cf7d234c8383c761f7555at txn 0x415dc8e4387ead4c201873451bf7008cac8984012c00304e0f949872c5d5958b
Token Balance:
 Latest 25 transactions from a total of 9463 transactions
(+5 PendingTxns)

TxHash Age From To Value [TxFee]
0x5af793d8eb1ba5bc2c8f94d80e99a850e46dc0d97097c64781b37295128b96f9(pending)0x93b91d1a7a17d4fc230abf608139851ab069cd33  IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether(Pending)
0xcabf27d2bb3f1a8e3e7dd7d87c4de646fc211348ffc3e09060979a2a548fbac3(pending)0x93b91d1a7a17d4fc230abf608139851ab069cd33  IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether(Pending)
0xd0fb94593d526e936ea29a76c86453c9d839f4d04ebf9440645b18e5f9ddde0b(pending)0x93b91d1a7a17d4fc230abf608139851ab069cd33  IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether(Pending)
0x9ee05101a9b4aec2f3bd68f65d6f3bc77fd31040be11536c1c4d91fe48ddbe7e(pending)0xd3e91d6c4a21341db0abf50f237b2f1ec6b8ce61  IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether(Pending)
0xcede64f644ec16c1eda2e6ebdf798a33194f39809da8af8f11fdf256bb62c9e5(pending)0x927199049ba991de0ad3941c49bac32a7a727560  IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether(Pending)
0x1fe03a727cb769ba0dbd2cba6e2447d43d89b9855fb0bea414b859ecb96fe8c415 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00186715
0x31dfd2f99d04f2f83ad7ac45c561fe5338644907d28fabc9cafe12df2d73ac1231 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00112029
0xa67d4753e4965f5c3dcfd3c43d6250a5f8cbf57c13ddfa6ce007ba7c8a7643861 hr 1 min ago0x77c6e4a33bc2a92836c5585af2d42feecb41b46e  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00035857
0xb6f9c639af63833e15bbf3f452e772751736a2df2e5d5c1d1d94e52719ba261e1 hr 2 mins ago0x213aebc4884a2971d8ab9b58412d4a99ef9f1aec  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.000537855
0xc949a34a062e89e189dfa9dc30ce625e903c4f27027911c9615d49c921fda9c91 hr 11 mins ago0x77c6e4a33bc2a92836c5585af2d42feecb41b46e  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.001313906
0x4f777199c2dd7dad2637706313a99efc19f68582404aab6e950d686da4a294cd1 hr 16 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00112029
0x4b6fe8be60ba8c33d3110e6184205c44a174b07055e968bd976f6a231e9617761 hr 30 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00112496
0xb1f78bcf3b72f697d6d88b18d33e1848cb2ded893bdd44d0ed01a703eba74dde1 hr 45 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00186715
0x962d558a771d44ffd1f8a2650295512f435d8d00eca861744c4e686f4db80c771 hr 47 mins ago0x77c6e4a33bc2a92836c5585af2d42feecb41b46e  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.001322248
0xec8ba0425197b44e6982b2944bf213a230955111842cc649857edbce61b3eb421 hr 51 mins ago0x77c6e4a33bc2a92836c5585af2d42feecb41b46e  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00035857
0x965f208f6b3d5c313691b6718e62b21cfecedc6b7049cf1e19947bbab51f6db71 hr 56 mins ago0xf31bcd2c485ec2f9eec76359ce4fb8c8120f6b8e  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.000358442
0x1bf248be6a3f67188e23a868c56758a788770d78332a9ba23fe350eaff65fe281 hr 57 mins ago0x9ab5abddb96afb1d8453ffd6845ec81d5f77bfd6  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.001314242
0x2a1ec10310accdff3481db9f9e2453abe068ed3bf37d7bf9559b7f0ecd288b222 hrs 1 min ago0x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc4  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.000479875
0x0fd9906ebe1ff94aec9b0c8507de9ae630f761edc33188ba084b519ff2d67ac62 hrs 6 mins ago0x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc4  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.000479875
0x54c527fbaa6064734a50ec240b20333694f9321cb65d199d0a0ed53a9ca273542 hrs 7 mins ago0xb8413283156453562a22ef0ad0bc2e97cd6a12de  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.000527285
0x514b7ce2c3f12b313694384b4af47196121ac8f43a1bcd511e721f61bb71c59f2 hrs 7 mins ago0xb8413283156453562a22ef0ad0bc2e97cd6a12de  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.000527285
0x68f4e7c9f32b57f6c149764f40fb5b4ed5fc39718693002d595b2eb42495ca852 hrs 8 mins ago0x1f112d22f9fc9d5dc4a710bd4ebff2cf4fbb8b82  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.000527285
0x39d460ab56ced148ea1011410047336776210cf112c965f1c93b03df15c260c92 hrs 8 mins ago0x1f112d22f9fc9d5dc4a710bd4ebff2cf4fbb8b82  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.000527285
0x01771edd12201792677a82ca8310289ff2c0d7c418e8e9bea3c990e8426a732d2 hrs 9 mins ago0x1f112d22f9fc9d5dc4a710bd4ebff2cf4fbb8b82  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.000527285
0x19de6a7c3fe856f5f2d72a8a1165534b71880111cae9640ae266d35fd13f2e552 hrs 9 mins ago0x1f112d22f9fc9d5dc4a710bd4ebff2cf4fbb8b82  IN   0x8bc67d00253fd60b1afcce88b78820413139f4c60.002 Ether0.000527285
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0xc949a34a062e89e189dfa9dc30ce625e903c4f27027911c9615d49c921fda9c971187181 hr 11 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x962d558a771d44ffd1f8a2650295512f435d8d00eca861744c4e686f4db80c7771185851 hr 47 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x1bf248be6a3f67188e23a868c56758a788770d78332a9ba23fe350eaff65fe2871185491 hr 57 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x54c527fbaa6064734a50ec240b20333694f9321cb65d199d0a0ed53a9ca2735471185152 hrs 7 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc40.002 Ether
0x514b7ce2c3f12b313694384b4af47196121ac8f43a1bcd511e721f61bb71c59f71185122 hrs 7 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc40.002 Ether
0x68f4e7c9f32b57f6c149764f40fb5b4ed5fc39718693002d595b2eb42495ca8571185082 hrs 8 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc40.002 Ether
0x39d460ab56ced148ea1011410047336776210cf112c965f1c93b03df15c260c971185082 hrs 8 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc40.002 Ether
0x01771edd12201792677a82ca8310289ff2c0d7c418e8e9bea3c990e8426a732d71185062 hrs 9 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc40.002 Ether
0x19de6a7c3fe856f5f2d72a8a1165534b71880111cae9640ae266d35fd13f2e5571185042 hrs 9 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc40.002 Ether
0x99de6371cc858a580cac3756df1696510417b8bdb17a5e6d412a5c0d9152b9c871184192 hrs 40 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x99de6371cc858a580cac3756df1696510417b8bdb17a5e6d412a5c0d9152b9c871184192 hrs 40 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xb7c19314bed49bc9bdca1a97fc89a780f46f2cb40.00349901813271605 Ether
0x8ee108a7fdb1bb923344382638d4315401d168b4761c2a74a15dbe84c89a1dc471183932 hrs 47 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60x6da1b6a47fa5e5c79a5067cd030f26c2629ebfc40.002 Ether
0xdaec5dc2a7361868943ed0cedecd4b5fed3dc7d1004a3a706b104e18048a43eb71178105 hrs 22 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xdaec5dc2a7361868943ed0cedecd4b5fed3dc7d1004a3a706b104e18048a43eb71178105 hrs 22 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xb7c19314bed49bc9bdca1a97fc89a780f46f2cb40.004501157407407408 Ether
0x2c8808f6b677eaaa64fa916df79e570c7a5540e2a343dfe3eac3811c51eb3f3971176276 hrs 19 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xa1b523fe4737b275b7daaee2b7e9fec956db42cab9ecd65f5beaec0588234c4a71170588 hrs 50 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xa1b523fe4737b275b7daaee2b7e9fec956db42cab9ecd65f5beaec0588234c4a71170588 hrs 50 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xb7c19314bed49bc9bdca1a97fc89a780f46f2cb40.00499984425154321 Ether
0x58eceef3ac3c79d6ad7e210118543c24e68721d240fdbea1c2f4b677582800bf71170538 hrs 53 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x3074831c27086de835239a99837e0e7b0702ff48e7031cfe80929178b48cd28a711680910 hrs 4 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xee7a990249f25f36416e80ec1619de6fb10c73a9d47427f4744132e5015afbed711679510 hrs 7 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xa7bcbf0ce76a10c1cd9abf07098cebc5481e8b166610fedeefb98e6bb193bbce711678510 hrs 11 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xe6fc7bdac984fc12a10379d77acca103b50281e461c32ebf68de6ecc98124eb8711677910 hrs 12 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x91e8fe266d1f2aef2ab7538994226994ca1df41be6416d20640e26cfdd748688711656711 hrs 13 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xcf2d8851930d36e0b5cf8a17ddd760e82e71ea90034c68a15d6341d04e2028d4711647211 hrs 39 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xca4dfbc782c32b00fd8e317b98e72fb5f380f9c82caffe69ad57402bb1e6e1ca711646811 hrs 40 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact Match)
Contract Name: FlowerCore
Compiler Text: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.23;

library SafeMath {

    /**
    * @dev Multiplies two numbers, reverts on overflow.
    */
    function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (_a == 0) {
            return 0;
        }

        uint256 c = _a * _b;
        require(c / _a == _b);

        return c;
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b > 0); // Solidity only automatically asserts when dividing by 0
        uint256 c = _a / _b;
        // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b <= _a);
        uint256 c = _a - _b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
        uint256 c = _a + _b;
        require(c >= _a);

        return c;
    }
}

library AddressUtils {

    /**
    * Returns whether the target address is a contract
    * @dev This function will return false if invoked during the constructor of a contract,
    *  as the code is not actually created until after the constructor finishes.
    * @param addr address to check
    * @return whether the target address is a contract
    */
    function isContract(address addr) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solium-disable-next-line security/no-inline-assembly
        assembly { size := extcodesize(addr) }
        return size > 0;
    }

}

contract Ownable {
    address public owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        owner = newOwner;
        emit OwnershipTransferred(owner, newOwner);
    }
}

contract ERC721Basic {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    function balanceOf(address _owner) public view returns (uint256 _balance);
    function ownerOf(uint256 _tokenId) public view returns (address _owner);
    function exists(uint256 _tokenId) public view returns (bool _exists);

    function approve(address _to, uint256 _tokenId) public;
    function getApproved(uint256 _tokenId) public view returns (address _operator);

    function setApprovalForAll(address _operator, bool _approved) public;
    function isApprovedForAll(address _owner, address _operator) public view returns (bool);

    function transferFrom(address _from, address _to, uint256 _tokenId) public;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
    function tokenByIndex(uint256 _index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
    function name() public view returns (string _name);
    function symbol() public view returns (string _symbol);
    function tokenURI(uint256 _tokenId) public view returns (string);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is ERC721Basic {
    using SafeMath for uint256;
    using AddressUtils for address;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    bytes4 public constant ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) internal tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) internal tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => uint256) internal ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) internal operatorApprovals;

    /**
    * @dev Guarantees msg.sender is owner of the given token
    * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
    */
    modifier onlyOwnerOf(uint256 _tokenId) {
        require (ownerOf(_tokenId) == msg.sender);
        _;
    }

    /**
    * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
    * @param _tokenId uint256 ID of the token to validate
    */
    modifier canTransfer(uint256 _tokenId) {
        require (isApprovedOrOwner(msg.sender, _tokenId));
        _;
    }

    /**
    * @dev Gets the balance of the specified address
    * @param _owner address to query the balance of
    * @return uint256 representing the amount owned by the passed address
    */
    function balanceOf(address _owner) public view returns (uint256) {
        require (_owner != address(0));
        return ownedTokensCount[_owner];
    }

    /**
    * @dev Gets the owner of the specified token ID
    * @param _tokenId uint256 ID of the token to query the owner of
    * @return owner address currently marked as the owner of the given token ID
    */
    function ownerOf(uint256 _tokenId) public view returns (address) {
        address owner = tokenOwner[_tokenId];
        require(owner != address(0));
        return owner;
    }

    function isOwnerOf(address _owner, uint256 _tokenId) public view returns (bool) {
        address owner = ownerOf(_tokenId);
        return owner == _owner;
    }

    /**
    * @dev Returns whether the specified token exists
    * @param _tokenId uint256 ID of the token to query the existence of
    * @return whether the token exists
    */
    function exists(uint256 _tokenId) public view returns (bool) {
        address owner = tokenOwner[_tokenId];
        return owner != address(0);
    }

    /**
    * @dev Approves another address to transfer the given token ID
    * @dev The zero address indicates there is no approved address.
    * @dev There can only be one approved address per token at a given time.
    * @dev Can only be called by the token owner or an approved operator.
    * @param _to address to be approved for the given token ID
    * @param _tokenId uint256 ID of the token to be approved
    */
    function approve(address _to, uint256 _tokenId) public {
        address owner = ownerOf(_tokenId);
        require (_to != owner);
        require (msg.sender == owner || isApprovedForAll(owner, msg.sender));

        tokenApprovals[_tokenId] = _to;
        emit Approval(owner, _to, _tokenId);
    }

    /**
    * @dev Gets the approved address for a token ID, or zero if no address set
    * @param _tokenId uint256 ID of the token to query the approval of
    * @return address currently approved for the given token ID
    */
    function getApproved(uint256 _tokenId) public view returns (address) {
        return tokenApprovals[_tokenId];
    }

    /**
    * @dev Sets or unsets the approval of a given operator
    * @dev An operator is allowed to transfer all tokens of the sender on their behalf
    * @param _to operator address to set the approval
    * @param _approved representing the status of the approval to be set
    */
    function setApprovalForAll(address _to, bool _approved) public {
        require (_to != msg.sender);
        operatorApprovals[msg.sender][_to] = _approved;
        emit ApprovalForAll(msg.sender, _to, _approved);
    }

    /**
    * @dev Tells whether an operator is approved by a given owner
    * @param _owner owner address which you want to query the approval of
    * @param _operator operator address which you want to query the approval of
    * @return bool whether the given operator is approved by the given owner
    */
    function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
        return operatorApprovals[_owner][_operator];
    }

    /**
    * @dev Transfers the ownership of a given token ID to another address
    * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function transferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) {
        require (_from != address(0));
        require (_to != address(0));

        clearApproval(_from, _tokenId);
        removeTokenFrom(_from, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev If the target address is a contract, it must implement `onERC721Received`,
    *  which is called upon a safe transfer, and return the magic value
    *  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) {
        // solium-disable-next-line arg-overflow
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
    * @dev Safely transfers the ownership of a given token ID to another address
    * @dev If the target address is a contract, it must implement `onERC721Received`,
    *  which is called upon a safe transfer, and return the magic value
    *  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
    *  the transfer is reverted.
    * @dev Requires the msg sender to be the owner, approved, or operator
    * @param _from current owner of the token
    * @param _to address to receive the ownership of the given token ID
    * @param _tokenId uint256 ID of the token to be transferred
    * @param _data bytes data to send along with a safe transfer check
    */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public canTransfer(_tokenId) {
        transferFrom(_from, _to, _tokenId);
        // solium-disable-next-line arg-overflow
        require (checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
    }

    /**
    * @dev Returns whether the given spender can transfer a given token ID
    * @param _spender address of the spender to query
    * @param _tokenId uint256 ID of the token to be transferred
    * @return bool whether the msg.sender is approved for the given token ID,
    *  is an operator of the owner, or is the owner of the token
    */
    function isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) {
        address owner = ownerOf(_tokenId);
        // Disable solium check because of
        // https://github.com/duaraghav8/Solium/issues/175
        // solium-disable-next-line operator-whitespace
        return (_spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender));
    }

    /**
    * @dev Internal function to mint a new token
    * @dev Reverts if the given token ID already exists
    * @param _to The address that will own the minted token
    * @param _tokenId uint256 ID of the token to be minted by the msg.sender
    */
    function _mint(address _to, uint256 _tokenId) internal {
        //require (_to != address(0));
        addTokenTo(_to, _tokenId);
        emit Transfer(address(0), _to, _tokenId);
    }

    /**
    * @dev Internal function to burn a specific token
    * @dev Reverts if the token does not exist
    * @param _tokenId uint256 ID of the token being burned by the msg.sender
    */
    function _burn(address _owner, uint256 _tokenId) internal {
        clearApproval(_owner, _tokenId);
        removeTokenFrom(_owner, _tokenId);
        emit Transfer(_owner, address(0), _tokenId);
    }

    /**
    * @dev Internal function to clear current approval of a given token ID
    * @dev Reverts if the given address is not indeed the owner of the token
    * @param _owner owner of the token
    * @param _tokenId uint256 ID of the token to be transferred
    */
    function clearApproval(address _owner, uint256 _tokenId) internal {
        require (ownerOf(_tokenId) == _owner);
        if (tokenApprovals[_tokenId] != address(0)) {
            tokenApprovals[_tokenId] = address(0);
        }
    }

    /**
    * @dev Internal function to add a token ID to the list of a given address
    * @param _to address representing the new owner of the given token ID
    * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
    */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        //        require (tokenOwner[_tokenId] == address(0));
        tokenOwner[_tokenId] = _to;
        ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
    }

    /**
    * @dev Internal function to remove a token ID from the list of a given address
    * @param _from address representing the previous owner of the given token ID
    * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
    */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        require (ownerOf(_tokenId) == _from);
        ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
        tokenOwner[_tokenId] = address(0);
    }

    /**
    * @dev Internal function to invoke `onERC721Received` on a target address
    * @dev The call is not executed if the target address is not a contract
    * @param _from address representing the previous owner of the given token ID
    * @param _to target address that will receive the tokens
    * @param _tokenId uint256 ID of the token to be transferred
    * @param _data bytes optional data to send along with the call
    * @return whether the call correctly returned the expected magic value
    */
    function checkAndCallSafeTransfer(address _from, address _to, uint256 _tokenId, bytes _data) internal returns (bool) {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
        return (retval == ERC721_RECEIVED);
    }
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721 asset contracts.
 */
contract ERC721Receiver {
    /**
    * @dev Magic value to be returned upon successful reception of an NFT
    *  Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`,
    *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
    */
    bytes4 public constant ERC721_RECEIVED = 0x150b7a02;

    /**
    * @notice Handle the receipt of an NFT
    * @dev The ERC721 smart contract calls this function on the recipient
    *  after a `safetransfer`. This function MAY throw to revert and reject the
    *  transfer. This function MUST use 50,000 gas or less. Return of other
    *  than the magic value MUST result in the transaction being reverted.
    *  Note: the contract address is always the message sender.
    * @param _from The sending address
    * @param _tokenId The NFT identifier which is being transfered
    * @param _data Additional data with no specified format
    * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    */
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) public returns(bytes4);
}

contract ERC721Holder is ERC721Receiver {
    function onERC721Received(address, address, uint256, bytes) public returns(bytes4) {
        return ERC721_RECEIVED;
    }
}

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is ERC721, ERC721BasicToken {

    // Token name
    string internal name_ = "CryptoFlowers";

    // Token symbol
    string internal symbol_ = "CF";

    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) internal ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) internal ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] internal allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) internal allTokensIndex;

    function uint2str(uint i) internal pure returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint length;
        while (j != 0){
            length++;
            j /= 10;
        }
        bytes memory bstr = new bytes(length);
        uint k = length - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }

    function strConcat(string _a, string _b) internal pure returns (string) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        string memory ab = new string(_ba.length + _bb.length);
        bytes memory bab = bytes(ab);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) bab[k++] = _bb[i];

        return string(bab);
    }

    /**
    * @dev Returns an URI for a given token ID
    * @dev Throws if the token ID does not exist. May return an empty string.
    * @notice The user/developper needs to add the tokenID, in the end of URL, to
    * use the URI and get all details. Ex. www.<apiURL>.com/token/<tokenID>
    * @param _tokenId uint256 ID of the token to query
    */
    function tokenURI(uint256 _tokenId) public view returns (string) {
        require(exists(_tokenId));
        string memory infoUrl;
        infoUrl = strConcat('https://cryptoflowers.io/v/', uint2str(_tokenId));
        return infoUrl;
    }

    /**
    * @dev Gets the token ID at a given index of the tokens list of the requested owner
    * @param _owner address owning the tokens list to be accessed
    * @param _index uint256 representing the index to be accessed of the requested tokens list
    * @return uint256 token ID at the given index of the tokens list owned by the requested address
    */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
        require (_index < balanceOf(_owner));
        return ownedTokens[_owner][_index];
    }

    /**
    * @dev Gets the total amount of tokens stored by the contract
    * @return uint256 representing the total amount of tokens
    */
    function totalSupply() public view returns (uint256) {
        return allTokens.length - 1;
    }

    /**
    * @dev Gets the token ID at a given index of all the tokens in this contract
    * @dev Reverts if the index is greater or equal to the total number of tokens
    * @param _index uint256 representing the index to be accessed of the tokens list
    * @return uint256 token ID at the given index of the tokens list
    */
    function tokenByIndex(uint256 _index) public view returns (uint256) {
        require (_index <= totalSupply());
        return allTokens[_index];
    }


    /**
    * @dev Internal function to add a token ID to the list of a given address
    * @param _to address representing the new owner of the given token ID
    * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
    */
    function addTokenTo(address _to, uint256 _tokenId) internal {
        super.addTokenTo(_to, _tokenId);
        uint256 length = ownedTokens[_to].length;
        ownedTokens[_to].push(_tokenId);
        ownedTokensIndex[_tokenId] = length;
    }

    /**
    * @dev Internal function to remove a token ID from the list of a given address
    * @param _from address representing the previous owner of the given token ID
    * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
    */
    function removeTokenFrom(address _from, uint256 _tokenId) internal {
        super.removeTokenFrom(_from, _tokenId);

        // To prevent a gap in the array, we store the last token in the index of the token to delete, and
        // then delete the last slot.
        uint256 tokenIndex = ownedTokensIndex[_tokenId];
        uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
        uint256 lastToken = ownedTokens[_from][lastTokenIndex];

        ownedTokens[_from][tokenIndex] = lastToken;
        // This also deletes the contents at the last position of the array
        ownedTokens[_from].length--;

        // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
        // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
        // the lastToken to the first position, and then dropping the element placed in the last position of the list

        ownedTokensIndex[_tokenId] = 0;
        ownedTokensIndex[lastToken] = tokenIndex;
    }

    /**
    * @dev Gets the token name
    * @return string representing the token name
    */
    function name() public view returns (string) {
        return name_;
    }

    /**
    * @dev Gets the token symbol
    * @return string representing the token symbol
    */
    function symbol() public view returns (string) {
        return symbol_;
    }

    /**
    * @dev Internal function to mint a new token
    * @dev Reverts if the given token ID already exists
    * @param _to address the beneficiary that will own the minted token
    * @param _tokenId uint256 ID of the token to be minted by the msg.sender
    */
    function _mint(address _to, uint256 _tokenId) internal {
        super._mint(_to, _tokenId);

        allTokensIndex[_tokenId] = allTokens.length;
        allTokens.push(_tokenId);
    }

    /**
    * @dev Internal function to burn a specific token
    * @dev Reverts if the token does not exist
    * @param _owner owner of the token to burn
    * @param _tokenId uint256 ID of the token being burned by the msg.sender
    */
    function _burn(address _owner, uint256 _tokenId) internal {
        super._burn(_owner, _tokenId);

        // Reorg all tokens array
        uint256 tokenIndex = allTokensIndex[_tokenId];
        uint256 lastTokenIndex = allTokens.length.sub(1);
        uint256 lastToken = allTokens[lastTokenIndex];

        allTokens[tokenIndex] = lastToken;
        allTokens[lastTokenIndex] = 0;

        allTokens.length--;
        allTokensIndex[_tokenId] = 0;
        allTokensIndex[lastToken] = tokenIndex;
    }

    bytes4 constant InterfaceSignature_ERC165 = 0x01ffc9a7;
    /*
    bytes4(keccak256('supportsInterface(bytes4)'));
    */

    bytes4 constant InterfaceSignature_ERC721Enumerable = 0x780e9d63;
    /*
    bytes4(keccak256('totalSupply()')) ^
    bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
    bytes4(keccak256('tokenByIndex(uint256)'));
    */

    bytes4 constant InterfaceSignature_ERC721Metadata = 0x5b5e139f;
    /*
    bytes4(keccak256('name()')) ^
    bytes4(keccak256('symbol()')) ^
    bytes4(keccak256('tokenURI(uint256)'));
    */

    bytes4 constant InterfaceSignature_ERC721 = 0x80ac58cd;
    /*
    bytes4(keccak256('balanceOf(address)')) ^
    bytes4(keccak256('ownerOf(uint256)')) ^
    bytes4(keccak256('approve(address,uint256)')) ^
    bytes4(keccak256('getApproved(uint256)')) ^
    bytes4(keccak256('setApprovalForAll(address,bool)')) ^
    bytes4(keccak256('isApprovedForAll(address,address)')) ^
    bytes4(keccak256('transferFrom(address,address,uint256)')) ^
    bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
    bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'));
    */

    bytes4 public constant InterfaceSignature_ERC721Optional =- 0x4f558e79;
    /*
    bytes4(keccak256('exists(uint256)'));
    */

    /**
    * @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    * @dev Returns true for any standardized interfaces implemented by this contract.
    * @param _interfaceID bytes4 the interface to check for
    * @return true for any standardized interfaces implemented by this contract.
    */
    function supportsInterface(bytes4 _interfaceID) external pure returns (bool)
    {
        return ((_interfaceID == InterfaceSignature_ERC165)
        || (_interfaceID == InterfaceSignature_ERC721)
        || (_interfaceID == InterfaceSignature_ERC721Enumerable)
        || (_interfaceID == InterfaceSignature_ERC721Metadata));
    }

    function implementsERC721() public pure returns (bool) {
        return true;
    }

}

contract GenomeInterface {
    function isGenome() public pure returns (bool);
    function mixGenes(uint256 genes1, uint256 genes2) public returns (uint256);
}

contract FlowerAdminAccess {
    address public rootAddress;
    address public adminAddress;

    event ContractUpgrade(address newContract);

    address public gen0SellerAddress;
    address public giftHolderAddress;

    bool public stopped = false;

    modifier onlyRoot() {
        require(msg.sender == rootAddress);
        _;
    }

    modifier onlyAdmin()  {
        require(msg.sender == adminAddress);
        _;
    }

    modifier onlyAdministrator() {
        require(msg.sender == rootAddress || msg.sender == adminAddress);
        _;
    }

    function setRoot(address _newRoot) external onlyAdministrator {
        require(_newRoot != address(0));
        rootAddress = _newRoot;
    }

    function setAdmin(address _newAdmin) external onlyRoot {
        require(_newAdmin != address(0));
        adminAddress = _newAdmin;
    }

    modifier whenNotStopped() {
        require(!stopped);
        _;
    }

    modifier whenStopped {
        require(stopped);
        _;
    }

    function setStop() public onlyAdministrator whenNotStopped {
        stopped = true;
    }

    function setStart() public onlyAdministrator whenStopped {
        stopped = false;
    }
}

contract FlowerBase is ERC721Token {

    struct Flower {
        uint256 genes;
        uint64 birthTime;
        uint64 cooldownEndBlock;
        uint32 matronId;
        uint32 sireId;
        uint16 cooldownIndex;
        uint16 generation;
    }

    Flower[] flowers;

    mapping (uint256 => uint256) genomeFlowerIds;

    // Сooldown duration
    uint32[14] public cooldowns = [
    uint32(1 minutes),
    uint32(2 minutes),
    uint32(5 minutes),
    uint32(10 minutes),
    uint32(30 minutes),
    uint32(1 hours),
    uint32(2 hours),
    uint32(4 hours),
    uint32(8 hours),
    uint32(16 hours),
    uint32(1 days),
    uint32(2 days),
    uint32(4 days),
    uint32(7 days)
    ];

    event Birth(address owner, uint256 flowerId, uint256 matronId, uint256 sireId, uint256 genes);
    event Transfer(address from, address to, uint256 tokenId);
    event Money(address from, string actionType, uint256 sum, uint256 cut, uint256 tokenId, uint256 blockNumber);

    function _createFlower(uint256 _matronId, uint256 _sireId, uint256 _generation, uint256 _genes, address _owner) internal returns (uint) {
        require(_matronId == uint256(uint32(_matronId)));
        require(_sireId == uint256(uint32(_sireId)));
        require(_generation == uint256(uint16(_generation)));
        require(checkUnique(_genes));

        uint16 cooldownIndex = uint16(_generation / 2);
        if (cooldownIndex > 13) {
            cooldownIndex = 13;
        }

        Flower memory _flower = Flower({
            genes: _genes,
            birthTime: uint64(now),
            cooldownEndBlock: 0,
            matronId: uint32(_matronId),
            sireId: uint32(_sireId),
            cooldownIndex: cooldownIndex,
            generation: uint16(_generation)
            });

        uint256 newFlowerId = flowers.push(_flower) - 1;

        require(newFlowerId == uint256(uint32(newFlowerId)));

        genomeFlowerIds[_genes] = newFlowerId;

        emit Birth(_owner, newFlowerId, uint256(_flower.matronId), uint256(_flower.sireId), _flower.genes);

        _mint(_owner, newFlowerId);

        return newFlowerId;
    }

    function checkUnique(uint256 _genome) public view returns (bool) {
        uint256 _flowerId = uint256(genomeFlowerIds[_genome]);
        return !(_flowerId > 0);
    }
}

contract FlowerOwnership is FlowerBase, FlowerAdminAccess {
    SaleClockAuction public saleAuction;
    BreedingClockAuction public breedingAuction;

    uint256 public secondsPerBlock = 15;

    function setSecondsPerBlock(uint256 secs) external onlyAdministrator {
        require(secs < cooldowns[0]);
        secondsPerBlock = secs;
    }
}

contract ClockAuctionBase {

    struct Auction {
        address seller;
        uint128 startingPrice;
        uint128 endingPrice;
        uint64 duration;
        uint64 startedAt;
    }

    ERC721Token public nonFungibleContract;

    uint256 public ownerCut;

    mapping (uint256 => Auction) tokenIdToAuction;

    event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);
    event AuctionCancelled(uint256 tokenId);
    event Money(address from, string actionType, uint256 sum, uint256 cut, uint256 tokenId, uint256 blockNumber);

    function isOwnerOf(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    function _escrow(address _owner, uint256 _tokenId) internal {
        nonFungibleContract.transferFrom(_owner, this, _tokenId);
    }

    function _transfer(address _receiver, uint256 _tokenId) internal {
        nonFungibleContract.transferFrom(this, _receiver, _tokenId);
    }

    function _addAuction(uint256 _tokenId, Auction _auction) internal {
        require(_auction.duration >= 1 minutes);

        tokenIdToAuction[_tokenId] = _auction;

        emit AuctionCreated(uint256(_tokenId), uint256(_auction.startingPrice), uint256(_auction.endingPrice), uint256(_auction.duration));
    }

    function _cancelAuction(uint256 _tokenId, address _seller) internal {
        _removeAuction(_tokenId);
        _transfer(_seller, _tokenId);
        emit AuctionCancelled(_tokenId);
    }

    function _bid(uint256 _tokenId, uint256 _bidAmount, address _sender) internal returns (uint256) {
        Auction storage auction = tokenIdToAuction[_tokenId];

        require(_isOnAuction(auction));

        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        address seller = auction.seller;

        _removeAuction(_tokenId);

        if (price > 0) {
            uint256 auctioneerCut = _computeCut(price);
            uint256 sellerProceeds = price - auctioneerCut;
            seller.transfer(sellerProceeds);

            emit Money(_sender, "AuctionSuccessful", price, auctioneerCut, _tokenId, block.number);
        }

        uint256 bidExcess = _bidAmount - price;

        _sender.transfer(bidExcess);

        emit AuctionSuccessful(_tokenId, price, _sender);

        return price;
    }

    function _removeAuction(uint256 _tokenId) internal {
        delete tokenIdToAuction[_tokenId];
    }

    function _isOnAuction(Auction storage _auction) internal view returns (bool) {
        return (_auction.startedAt > 0 && _auction.startedAt < now);
    }

    function _currentPrice(Auction storage _auction) internal view returns (uint256) {
        uint256 secondsPassed = 0;

        if (now > _auction.startedAt) {
            secondsPassed = now - _auction.startedAt;
        }

        return _computeCurrentPrice(_auction.startingPrice, _auction.endingPrice, _auction.duration, secondsPassed);
    }

    function _computeCurrentPrice(uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, uint256 _secondsPassed) internal pure returns (uint256) {
        if (_secondsPassed >= _duration) {
            return _endingPrice;
        } else {
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);

            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);

            int256 currentPrice = int256(_startingPrice) + currentPriceChange;

            return uint256(currentPrice);
        }
    }

    function _computeCut(uint256 _price) internal view returns (uint256) {
        return uint256(_price * ownerCut / 10000);
    }
}

contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;

    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    modifier whenPaused {
        require(paused);
        _;
    }

    function pause() public onlyOwner whenNotPaused returns (bool) {
        paused = true;
        emit Pause();
        return true;
    }

    function unpause() public onlyOwner whenPaused returns (bool) {
        paused = false;
        emit Unpause();
        return true;
    }
}

contract ClockAuction is Pausable, ClockAuctionBase {
    bytes4 constant InterfaceSignature_ERC721 = bytes4(0x80ac58cd);
    constructor(address _nftAddress, uint256 _cut) public {
        require(_cut <= 10000);
        ownerCut = _cut;

        ERC721Token candidateContract = ERC721Token(_nftAddress);
        require(candidateContract.supportsInterface(InterfaceSignature_ERC721));
        nonFungibleContract = candidateContract;
    }

    function withdrawBalance() external {
        address nftAddress = address(nonFungibleContract);
        require(msg.sender == owner || msg.sender == nftAddress);
        owner.transfer(address(this).balance);
    }

    function createAuction(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller, uint64 _startAt) external whenNotPaused {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));
        require(isOwnerOf(msg.sender, _tokenId));
        _escrow(msg.sender, _tokenId);
        uint64 startAt = _startAt;
        if (_startAt == 0) {
            startAt = uint64(now);
        }
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(startAt)
        );
        _addAuction(_tokenId, auction);
    }

    function bid(uint256 _tokenId, address _sender) external payable whenNotPaused {
        _bid(_tokenId, msg.value, _sender);
        _transfer(_sender, _tokenId);
    }

    function cancelAuction(uint256 _tokenId) external {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        address seller = auction.seller;
        require(msg.sender == seller);
        _cancelAuction(_tokenId, seller);
    }

    function cancelAuctionByAdmin(uint256 _tokenId) onlyOwner external {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        _cancelAuction(_tokenId, auction.seller);
    }

    function getAuction(uint256 _tokenId) external view returns (address seller, uint256 startingPrice, uint256 endingPrice, uint256 duration, uint256 startedAt) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return (auction.seller, auction.startingPrice, auction.endingPrice, auction.duration, auction.startedAt);
    }

    function getCurrentPrice(uint256 _tokenId) external view returns (uint256){
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }

    // TMP
    function getContractBalance() onlyOwner external view returns (uint256) {
        return address(this).balance;
    }
}

contract BreedingClockAuction is ClockAuction {

    bool public isBreedingClockAuction = true;

    constructor(address _nftAddr, uint256 _cut) public ClockAuction(_nftAddr, _cut) {}

    function bid(uint256 _tokenId, address _sender) external payable {
        require(msg.sender == address(nonFungibleContract));
        address seller = tokenIdToAuction[_tokenId].seller;
        _bid(_tokenId, msg.value, _sender);
        _transfer(seller, _tokenId);
    }

    function getCurrentPrice(uint256 _tokenId) external view returns (uint256) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }

    function createAuction(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller, uint64 _startAt) external {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        uint64 startAt = _startAt;
        if (_startAt == 0) {
            startAt = uint64(now);
        }
        Auction memory auction = Auction(_seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(startAt));
        _addAuction(_tokenId, auction);
    }
}





contract SaleClockAuction is ClockAuction {

    bool public isSaleClockAuction = true;

    uint256 public gen0SaleCount;
    uint256[5] public lastGen0SalePrices;

    constructor(address _nftAddr, uint256 _cut) public ClockAuction(_nftAddr, _cut) {}

    address public gen0SellerAddress;
    function setGen0SellerAddress(address _newAddress) external {
        require(msg.sender == address(nonFungibleContract));
        gen0SellerAddress = _newAddress;
    }

    function createAuction(uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller, uint64 _startAt) external {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        uint64 startAt = _startAt;
        if (_startAt == 0) {
            startAt = uint64(now);
        }
        Auction memory auction = Auction(_seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(startAt));
        _addAuction(_tokenId, auction);
    }

    function bid(uint256 _tokenId) external payable {
        // _bid verifies token ID size
        address seller = tokenIdToAuction[_tokenId].seller;
        uint256 price = _bid(_tokenId, msg.value, msg.sender);
        _transfer(msg.sender, _tokenId);

        // If not a gen0 auction, exit
        if (seller == address(gen0SellerAddress)) {
            // Track gen0 sale prices
            lastGen0SalePrices[gen0SaleCount % 5] = price;
            gen0SaleCount++;
        }
    }

    function bidGift(uint256 _tokenId, address _to) external payable {
        // _bid verifies token ID size
        address seller = tokenIdToAuction[_tokenId].seller;
        uint256 price = _bid(_tokenId, msg.value, msg.sender);
        _transfer(_to, _tokenId);

        // If not a gen0 auction, exit
        if (seller == address(gen0SellerAddress)) {
            // Track gen0 sale prices
            lastGen0SalePrices[gen0SaleCount % 5] = price;
            gen0SaleCount++;
        }
    }

    function averageGen0SalePrice() external view returns (uint256) {
        uint256 sum = 0;
        for (uint256 i = 0; i < 5; i++) {
            sum += lastGen0SalePrices[i];
        }
        return sum / 5;
    }

    function computeCut(uint256 _price) public view returns (uint256) {
        return _computeCut(_price);
    }

    function getSeller(uint256 _tokenId) public view returns (address) {
        return address(tokenIdToAuction[_tokenId].seller);
    }
}

// Flowers crossing
contract FlowerBreeding is FlowerOwnership {

    // Fee for breeding
    uint256 public autoBirthFee = 2 finney;
    uint256 public giftFee = 2 finney;

    GenomeInterface public geneScience;

    // Set Genome contract address
    function setGenomeContractAddress(address _address) external onlyAdministrator {
        geneScience = GenomeInterface(_address);
    }

    function _isReadyToAction(Flower _flower) internal view returns (bool) {
        return _flower.cooldownEndBlock <= uint64(block.number);
    }

    function isReadyToAction(uint256 _flowerId) public view returns (bool) {
        require(_flowerId > 0);
        Flower storage flower = flowers[_flowerId];
        return _isReadyToAction(flower);
    }

    function _setCooldown(Flower storage _flower) internal {
        _flower.cooldownEndBlock = uint64((cooldowns[_flower.cooldownIndex]/secondsPerBlock) + block.number);

        if (_flower.cooldownIndex < 13) {
            _flower.cooldownIndex += 1;
        }
    }

    function setAutoBirthFee(uint256 val) external onlyAdministrator {
        autoBirthFee = val;
    }

    function setGiftFee(uint256 _fee) external onlyAdministrator {
        giftFee = _fee;
    }

    // Check if a given sire and matron are a valid crossing pair
    function _isValidPair(Flower storage _matron, uint256 _matronId, Flower storage _sire, uint256 _sireId) private view returns(bool) {
        if (_matronId == _sireId) {
            return false;
        }

        // Generation zero can crossing
        if (_sire.matronId == 0 || _matron.matronId == 0) {
            return true;
        }

        // Do not crossing with it parrents
        if (_matron.matronId == _sireId || _matron.sireId == _sireId) {
            return false;
        }
        if (_sire.matronId == _matronId || _sire.sireId == _matronId) {
            return false;
        }

        // Can't crossing with brothers and sisters
        if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {
            return false;
        }
        if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {
            return false;
        }

        return true;
    }

    function canBreedWith(uint256 _matronId, uint256 _sireId) external view returns (bool) {
        return _canBreedWith(_matronId, _sireId);
    }

    function _canBreedWith(uint256 _matronId, uint256 _sireId) internal view returns (bool) {
        require(_matronId > 0);
        require(_sireId > 0);
        Flower storage matron = flowers[_matronId];
        Flower storage sire = flowers[_sireId];
        return _isValidPair(matron, _matronId, sire, _sireId);
    }

    function _born(uint256 _matronId, uint256 _sireId) internal {
        Flower storage sire = flowers[_sireId];
        Flower storage matron = flowers[_matronId];

        uint16 parentGen = matron.generation;
        if (sire.generation > matron.generation) {
            parentGen = sire.generation;
        }

        uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes);
        address owner = ownerOf(_matronId);
        uint256 flowerId = _createFlower(_matronId, _sireId, parentGen + 1, childGenes, owner);

        Flower storage child = flowers[flowerId];

        _setCooldown(sire);
        _setCooldown(matron);
        _setCooldown(child);
    }

    // Crossing two of owner flowers
    function breedOwn(uint256 _matronId, uint256 _sireId) external payable whenNotStopped {
        require(msg.value >= autoBirthFee);
        require(isOwnerOf(msg.sender, _matronId));
        require(isOwnerOf(msg.sender, _sireId));

        Flower storage matron = flowers[_matronId];
        require(_isReadyToAction(matron));

        Flower storage sire = flowers[_sireId];
        require(_isReadyToAction(sire));

        require(_isValidPair(matron, _matronId, sire, _sireId));

        _born(_matronId, _sireId);

        gen0SellerAddress.transfer(autoBirthFee);

        emit Money(msg.sender, "BirthFee-own", autoBirthFee, autoBirthFee, _sireId, block.number);
    }
}

// Handles creating auctions for sale and siring
contract FlowerAuction is FlowerBreeding {

    // Set sale auction contract address
    function setSaleAuctionAddress(address _address) external onlyAdministrator {
        SaleClockAuction candidateContract = SaleClockAuction(_address);
        require(candidateContract.isSaleClockAuction());
        saleAuction = candidateContract;
    }

    // Set siring auction contract address
    function setBreedingAuctionAddress(address _address) external onlyAdministrator {
        BreedingClockAuction candidateContract = BreedingClockAuction(_address);
        require(candidateContract.isBreedingClockAuction());
        breedingAuction = candidateContract;
    }

    // Flower sale auction
    function createSaleAuction(uint256 _flowerId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) external whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));
        approve(saleAuction, _flowerId);
        saleAuction.createAuction(_flowerId, _startingPrice, _endingPrice, _duration, msg.sender, 0);
    }

    // Create siring auction
    function createBreedingAuction(uint256 _flowerId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) external whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));
        approve(breedingAuction, _flowerId);
        breedingAuction.createAuction(_flowerId, _startingPrice, _endingPrice, _duration, msg.sender, 0);
    }

    // Siring auction complete
    function bidOnBreedingAuction(uint256 _sireId, uint256 _matronId) external payable whenNotStopped {
        require(isOwnerOf(msg.sender, _matronId));
        require(isReadyToAction(_matronId));
        require(isReadyToAction(_sireId));
        require(_canBreedWith(_matronId, _sireId));

        uint256 currentPrice = breedingAuction.getCurrentPrice(_sireId);
        require(msg.value >= currentPrice + autoBirthFee);

        // Siring auction will throw if the bid fails.
        breedingAuction.bid.value(msg.value - autoBirthFee)(_sireId, msg.sender);
        _born(uint32(_matronId), uint32(_sireId));
        gen0SellerAddress.transfer(autoBirthFee);
        emit Money(msg.sender, "BirthFee-bid", autoBirthFee, autoBirthFee, _sireId, block.number);
    }

    // Transfers the balance of the sale auction contract to the Core contract
    function withdrawAuctionBalances() external onlyAdministrator {
        saleAuction.withdrawBalance();
        breedingAuction.withdrawBalance();
    }

    function sendGift(uint256 _flowerId, address _to) external payable whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));

        transferFrom(msg.sender, _to, _flowerId);
    }

    function makeGift(uint256 _flowerId) external payable whenNotStopped {
        require(isOwnerOf(msg.sender, _flowerId));
        require(isReadyToAction(_flowerId));
        require(msg.value >= giftFee);

        transferFrom(msg.sender, giftHolderAddress, _flowerId);
        giftHolderAddress.transfer(msg.value);

        emit Money(msg.sender, "MakeGift", msg.value, msg.value, _flowerId, block.number);
    }
}

contract FlowerMinting is FlowerAuction {
    // Constants for gen0 auctions.
    uint256 public constant GEN0_STARTING_PRICE = 10 finney;
    uint256 public constant GEN0_AUCTION_DURATION = 1 days;
    // Counts the number of cats the contract owner has created
    uint256 public promoCreatedCount;
    uint256 public gen0CreatedCount;

    // Create promo flower
    function createPromoFlower(uint256 _genes, address _owner) external onlyAdministrator {
        address flowerOwner = _owner;
        if (flowerOwner == address(0)) {
            flowerOwner = adminAddress;
        }
        promoCreatedCount++;
        gen0CreatedCount++;
        _createFlower(0, 0, 0, _genes, flowerOwner);
    }

    function createGen0Auction(uint256 _genes, uint64 _auctionStartAt) external onlyAdministrator {
        uint256 flowerId = _createFlower(0, 0, 0, _genes, address(gen0SellerAddress));
        tokenApprovals[flowerId] = saleAuction;
        //approve(saleAuction, flowerId);

        gen0CreatedCount++;

        saleAuction.createAuction(flowerId, _computeNextGen0Price(), 0, GEN0_AUCTION_DURATION, address(gen0SellerAddress), _auctionStartAt);
    }

    // Computes the next gen0 auction starting price, given the average of the past 5 prices + 50%.
    function _computeNextGen0Price() internal view returns (uint256) {
        uint256 avePrice = saleAuction.averageGen0SalePrice();

        // Sanity check to ensure we don't overflow arithmetic
        require(avePrice == uint256(uint128(avePrice)));

        uint256 nextPrice = avePrice + (avePrice / 2);

        // We never auction for less than starting price
        if (nextPrice < GEN0_STARTING_PRICE) {
            nextPrice = GEN0_STARTING_PRICE;
        }

        return nextPrice;
    }

    function setGen0SellerAddress(address _newAddress) external onlyAdministrator {
        gen0SellerAddress = _newAddress;
        saleAuction.setGen0SellerAddress(_newAddress);
    }

    function setGiftHolderAddress(address _newAddress) external onlyAdministrator {
        giftHolderAddress = _newAddress;
    }
}

contract FlowerCore is FlowerMinting {

    constructor() public {
        stopped = true;
        rootAddress = msg.sender;
        adminAddress = msg.sender;
        _createFlower(0, 0, 0, uint256(-1), address(0));
    }

    // Get flower information
    function getFlower(uint256 _id) external view returns (bool isReady, uint256 cooldownIndex, uint256 nextActionAt, uint256 birthTime, uint256 matronId, uint256 sireId, uint256 generation, uint256 genes) {
        Flower storage flower = flowers[_id];
        isReady = (flower.cooldownEndBlock <= block.number);
        cooldownIndex = uint256(flower.cooldownIndex);
        nextActionAt = uint256(flower.cooldownEndBlock);
        birthTime = uint256(flower.birthTime);
        matronId = uint256(flower.matronId);
        sireId = uint256(flower.sireId);
        generation = uint256(flower.generation);
        genes = flower.genes;
    }

    // Start the game
    function unstop() public onlyAdministrator whenStopped {
        require(geneScience != address(0));

        super.setStart();
    }

    function withdrawBalance() external onlyAdministrator {
        rootAddress.transfer(address(this).balance);
    }
}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"_newRoot","type":"address"}],"name":"setRoot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"breedingAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"promoCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GEN0_STARTING_PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_genome","type":"uint256"}],"name":"checkUnique","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_flowerId","type":"uint256"}],"name":"isReadyToAction","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GEN0_AUCTION_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_flowerId","type":"uint256"}],"name":"makeGift","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"giftFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setStart","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"breedOwn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setBreedingAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_flowerId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setAutoBirthFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"secs","type":"uint256"}],"name":"setSecondsPerBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_flowerId","type":"uint256"},{"name":"_to","type":"address"}],"name":"sendGift","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceSignature_ERC721Optional","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGenomeContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sireId","type":"uint256"},{"name":"_matronId","type":"uint256"}],"name":"bidOnBreedingAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setGen0SellerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_owner","type":"address"}],"name":"createPromoFlower","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setStop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cooldowns","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_genes","type":"uint256"},{"name":"_auctionStartAt","type":"uint64"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getFlower","outputs":[{"name":"isReady","type":"bool"},{"name":"cooldownIndex","type":"uint256"},{"name":"nextActionAt","type":"uint256"},{"name":"birthTime","type":"uint256"},{"name":"matronId","type":"uint256"},{"name":"sireId","type":"uint256"},{"name":"generation","type":"uint256"},{"name":"genes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rootAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0SellerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"giftHolderAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"autoBirthFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setGiftFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setGiftHolderAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"isOwnerOf","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_flowerId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createBreedingAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC721_RECEIVED","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gen0CreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"geneScience","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unstop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"adminAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"flowerId","type":"uint256"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"},{"indexed":false,"name":"genes","type":"uint256"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"actionType","type":"string"},{"indexed":false,"name":"sum","type":"uint256"},{"indexed":false,"name":"cut","type":"uint256"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"blockNumber","type":"uint256"}],"name":"Money","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

  Contract Creation Code Switch To Opcodes View
60c0604052600d60808190527f43727970746f466c6f776572730000000000000000000000000000000000000060a090815262000040916004919062000644565b506040805180820190915260028082527f43460000000000000000000000000000000000000000000000000000000000006020909201918252620000879160059162000644565b50604080516101c081018252603c81526078602082015261012c9181019190915261025860608201526107086080820152610e1060a0820152611c2060c082015261384060e082015261708061010082015261e100610120820152620151806101408201526202a3006101608201526205460061018082015262093a806101a08201526200011a90600c90600e620006c9565b506011805460a060020a60ff0219169055600f60145566071afd498d000060158190556016553480156200014d57600080fd5b506011805460a060020a60ff02191674010000000000000000000000000000000000000000179055600e8054600160a060020a031990811633908117909255600f80549091169091179055620001b36000808060001981640100000000620001ba810204565b50620007e8565b600080620001c762000768565b600063ffffffff89168914620001dc57600080fd5b63ffffffff88168814620001ef57600080fd5b61ffff871687146200020057600080fd5b62000214866401000000006200049d810204565b15156200022057600080fd5b600287049250600d8361ffff1611156200023957600d92505b50506040805160e08101825285815267ffffffffffffffff42811660208301908152600093830184815263ffffffff808d16606086019081528c82166080870190815261ffff808a1660a089019081528e821660c08a01908152600a80546001810182559b52895160028c027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915597517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990980180549751955194519251915184167a0100000000000000000000000000000000000000000000000000000260d060020a61ffff02199290941678010000000000000000000000000000000000000000000000000260c060020a61ffff0219938816740100000000000000000000000000000000000000000260a060020a63ffffffff021996891670010000000000000000000000000000000002608060020a63ffffffff0219988d166801000000000000000002604060020a608060020a03199c909d1667ffffffffffffffff19909b169a909a179a909a169a909a179590951696909617929092169590951716949094179190911691909117909155909190811681146200040057600080fd5b6000868152600b602090815260409182902083905560608085015160808087015187518651600160a060020a038d16815295860188905263ffffffff938416868801529216928401929092529082015290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1620004918582640100000000620004b1810204565b98975050505050505050565b6000908152600b6020526040812054111590565b620004cb82826401000000006200339e6200051082021704565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b62000525828264010000000062000561810204565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200057d8383640100000000620031f2620005ba82021704565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b6000818152602081815260408083208054600160a060020a031916600160a060020a038716908117909155835260029091529020546200060a9060016401000000006200062a81026200338c1704565b600160a060020a0390921660009081526002602052604090209190915550565b6000828201838110156200063d57600080fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200068757805160ff1916838001178555620006b7565b82800160010185558215620006b7579182015b82811115620006b75782518255916020019190600101906200069a565b50620006c5929150620007a4565b5090565b6002830191839082156200075a5791602002820160005b838211156200072657835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620006e0565b8015620007585782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000726565b505b50620006c5929150620007c4565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b620007c191905b80821115620006c55760008155600101620007ab565b90565b620007c191905b80821115620006c557805463ffffffff19168155600101620007cb565b61349380620007f86000396000f3006080604052600436106102db5763ffffffff60e060020a6000350416623ba1ed81146102e05780630168605e1461030357806301ffc9a71461033457806305e455461461036a57806306fdde0314610391578063081812fc1461041b578063095ea7b3146104335780630e583df0146104575780631051db341461046c5780631280177d14610481578063174e7d551461049957806318160ddd146104b157806319c2f201146104c657806323b872dd146104db5780632933199a146105055780632f745c5914610510578063338d8fcf1461053457806335975a3714610549578063377173421461055e5780633d5e92961461056c5780633d7d3f5a1461058d57806342842e0e146105ae57806346d22c70146105d85780634b85fd55146105f35780634f558e791461060b5780634f6ccce7146106235780635663896e1461063b5780635b1fe0cb146106535780635fd8c7101461066a578063624de3d91461067f57806362ac302d146106b15780636352211e146106d25780636a226077146106ea5780636cf1cb29146106f85780636fbde40d14610719578063704b6c021461073a57806370a082311461075b57806375f12b211461077c5780637a530f03146107915780637a7d4937146107b557806391876e57146107ca57806392cf1d49146107df57806395d89b41146107f45780639d6fac6f146108095780639f0e19861461083a578063a22cb4651461085f578063a9203f3c14610885578063aaa2b8c8146108e0578063af39e9dd146108f5578063af8c4bf01461090a578063b0c35c051461091f578063b857ee7214610934578063b88d4fde1461094c578063bb4056c2146109bb578063c5b8f772146109dc578063c87b56dd14610a00578063e074118714610a18578063e6cbe35114610a39578063e985e9c514610a4e578063ecc98ce414610a75578063f1ca941014610a8a578063f2b47d5214610a9f578063f8bd71c714610ab4578063fc6f946814610ac9575b600080fd5b3480156102ec57600080fd5b50610301600160a060020a0360043516610ade565b005b34801561030f57600080fd5b50610318610b43565b60408051600160a060020a039092168252519081900360200190f35b34801561034057600080fd5b50610356600160e060020a031960043516610b52565b604080519115158252519081900360200190f35b34801561037657600080fd5b5061037f610c23565b60408051918252519081900360200190f35b34801561039d57600080fd5b506103a6610c29565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103e05781810151838201526020016103c8565b50505050905090810190601f16801561040d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042757600080fd5b50610318600435610cc0565b34801561043f57600080fd5b50610301600160a060020a0360043516602435610cdb565b34801561046357600080fd5b5061037f610d84565b34801561047857600080fd5b50610356610d8f565b34801561048d57600080fd5b50610356600435610d94565b3480156104a557600080fd5b50610356600435610da8565b3480156104bd57600080fd5b5061037f610e68565b3480156104d257600080fd5b5061037f610e72565b3480156104e757600080fd5b50610301600160a060020a0360043581169060243516604435610e79565b610301600435610f1e565b34801561051c57600080fd5b5061037f600160a060020a0360043516602435611044565b34801561054057600080fd5b5061037f611091565b34801561055557600080fd5b50610301611097565b6103016004356024356110fd565b34801561057857600080fd5b50610301600160a060020a03600435166113a6565b34801561059957600080fd5b50610301600435602435604435606435611472565b3480156105ba57600080fd5b50610301600160a060020a036004358116906024351660443561156d565b3480156105e457600080fd5b506103566004356024356115a5565b3480156105ff57600080fd5b506103016004356115b1565b34801561061757600080fd5b506103566004356115e4565b34801561062f57600080fd5b5061037f600435611601565b34801561064757600080fd5b50610301600435611637565b610301600435600160a060020a036024351661167e565b34801561067657600080fd5b506103016116cd565b34801561068b57600080fd5b50610694611738565b60408051600160e060020a03199092168252519081900360200190f35b3480156106bd57600080fd5b50610301600160a060020a036004351661175c565b3480156106de57600080fd5b506103186004356117ac565b6103016004356024356117d0565b34801561070457600080fd5b50610301600160a060020a0360043516611a4c565b34801561072557600080fd5b50610301600160a060020a0360043516611b11565b34801561074657600080fd5b50610301600160a060020a0360043516611bdd565b34801561076757600080fd5b5061037f600160a060020a0360043516611c2b565b34801561078857600080fd5b50610356611c5e565b34801561079d57600080fd5b50610301600435600160a060020a0360243516611c6e565b3480156107c157600080fd5b5061037f611ce2565b3480156107d657600080fd5b50610301611ce8565b3480156107eb57600080fd5b50610301611de8565b34801561080057600080fd5b506103a6611e53565b34801561081557600080fd5b50610821600435611eb4565b6040805163ffffffff9092168252519081900360200190f35b34801561084657600080fd5b5061030160043567ffffffffffffffff60243516611ee1565b34801561086b57600080fd5b50610301600160a060020a0360043516602435151561200e565b34801561089157600080fd5b5061089d600435612092565b6040805198151589526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108ec57600080fd5b50610318612127565b34801561090157600080fd5b50610318612136565b34801561091657600080fd5b50610318612145565b34801561092b57600080fd5b5061037f612154565b34801561094057600080fd5b5061030160043561215a565b34801561095857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261030194600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375094975061218d9650505050505050565b3480156109c757600080fd5b50610301600160a060020a03600435166121c5565b3480156109e857600080fd5b50610356600160a060020a0360043516602435612215565b348015610a0c57600080fd5b506103a6600435612239565b348015610a2457600080fd5b50610301600435602435604435606435612297565b348015610a4557600080fd5b50610318612374565b348015610a5a57600080fd5b50610356600160a060020a0360043581169060243516612383565b348015610a8157600080fd5b506106946123b1565b348015610a9657600080fd5b5061037f6123d5565b348015610aab57600080fd5b506103186123db565b348015610ac057600080fd5b506103016123ea565b348015610ad557600080fd5b50610318612451565b600e54600160a060020a0316331480610b015750600f54600160a060020a031633145b1515610b0c57600080fd5b600160a060020a0381161515610b2157600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b601354600160a060020a031681565b6000600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610bb55750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b80610be95750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c1d5750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b60185481565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b820191906000526020600020905b815481529060010190602001808311610c9857829003601f168201915b505050505090505b90565b600090815260016020526040902054600160a060020a031690565b6000610ce6826117ac565b9050600160a060020a038381169082161415610d0157600080fd5b33600160a060020a0382161480610d1d5750610d1d8133612383565b1515610d2857600080fd5b6000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b662386f26fc1000081565b600190565b6000908152600b6020526040812054111590565b600080808311610db757600080fd5b600a805484908110610dc557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c0820152909150610e6190612460565b9392505050565b6008546000190190565b6201518081565b80610e843382612477565b1515610e8f57600080fd5b600160a060020a0384161515610ea457600080fd5b600160a060020a0383161515610eb957600080fd5b610ec384836124d6565b610ecd8483612538565b610ed7838361263f565b8183600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60115460a060020a900460ff1615610f3557600080fd5b610f3f3382612215565b1515610f4a57600080fd5b610f5381610da8565b1515610f5e57600080fd5b601654341015610f6d57600080fd5b601154610f85903390600160a060020a031683610e79565b601154604051600160a060020a03909116903480156108fc02916000818181858888f19350505050158015610fbe573d6000803e3d6000fd5b5060408051338152348183018190526060820152608081018390524360a082015260c0602082018190526008908201527f4d616b654769667400000000000000000000000000000000000000000000000060e082015290517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150565b600061104f83611c2b565b821061105a57600080fd5b600160a060020a038316600090815260066020526040902080548390811061107e57fe5b9060005260206000200154905092915050565b60165481565b600e54600160a060020a03163314806110ba5750600f54600160a060020a031633145b15156110c557600080fd5b60115460a060020a900460ff1615156110dd57600080fd5b6011805474ff000000000000000000000000000000000000000019169055565b601154600090819060a060020a900460ff161561111957600080fd5b60155434101561112857600080fd5b6111323385612215565b151561113d57600080fd5b6111473384612215565b151561115257600080fd5b600a80548590811061116057fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529092506111fc90612460565b151561120757600080fd5b600a80548490811061121557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529091506112b190612460565b15156112bc57600080fd5b6112c882858386612688565b15156112d357600080fd5b6112dd8484612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f19350505050158015611319573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d6f776e000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150505050565b600e54600090600160a060020a03163314806113cc5750600f54600160a060020a031633145b15156113d757600080fd5b81905080600160a060020a03166312b91aca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b505050506040513d602081101561144257600080fd5b5051151561144f57600080fd5b60138054600160a060020a031916600160a060020a039290921691909117905550565b60115460a060020a900460ff161561148957600080fd5b6114933385612215565b151561149e57600080fd5b6114a784610da8565b15156114b257600080fd5b6012546114c890600160a060020a031685610cdb565b601254604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b5050505050505050565b806115783382612477565b151561158357600080fd5b61159f848484602060405190810160405280600081525061218d565b50505050565b6000610e618383612992565b600e54600160a060020a03163314806115d45750600f54600160a060020a031633145b15156115df57600080fd5b601555565b600090815260208190526040902054600160a060020a0316151590565b600061160b610e68565b82111561161757600080fd5b600880548390811061162557fe5b90600052602060002001549050919050565b600e54600160a060020a031633148061165a5750600f54600160a060020a031633145b151561166557600080fd5b600c5463ffffffff16811061167957600080fd5b601455565b60115460a060020a900460ff161561169557600080fd5b61169f3383612215565b15156116aa57600080fd5b6116b382610da8565b15156116be57600080fd5b6116c9338284610e79565b5050565b600e54600160a060020a03163314806116f05750600f54600160a060020a031633145b15156116fb57600080fd5b600e54604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015611735573d6000803e3d6000fd5b50565b7fb0aa71870000000000000000000000000000000000000000000000000000000081565b600e54600160a060020a031633148061177f5750600f54600160a060020a031633145b151561178a57600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b600081815260208190526040812054600160a060020a0316801515610c1d57600080fd5b60115460009060a060020a900460ff16156117ea57600080fd5b6117f43383612215565b15156117ff57600080fd5b61180882610da8565b151561181357600080fd5b61181c83610da8565b151561182757600080fd5b6118318284612992565b151561183c57600080fd5b601354604080517fc55d0f56000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163c55d0f56916024808201926020929091908290030181600087803b1580156118a357600080fd5b505af11580156118b7573d6000803e3d6000fd5b505050506040513d60208110156118cd57600080fd5b505160155490915081013410156118e357600080fd5b601354601554604080517f9f04996d000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0390931692639f04996d9234039160448082019260009290919082900301818588803b15801561195557600080fd5b505af1158015611969573d6000803e3d6000fd5b50505050506119848263ffffffff168463ffffffff16612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f193505050501580156119c0573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d626964000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a1505050565b600e54600160a060020a0316331480611a6f5750600f54600160a060020a031633145b1515611a7a57600080fd5b60108054600160a060020a031916600160a060020a03838116918217909255601254604080517f6cf1cb29000000000000000000000000000000000000000000000000000000008152600481019390935251921691636cf1cb299160248082019260009290919082900301818387803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b5050505050565b600e54600090600160a060020a0316331480611b375750600f54600160a060020a031633145b1515611b4257600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b50511515611bba57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600e54600160a060020a03163314611bf457600080fd5b600160a060020a0381161515611c0957600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0382161515611c4257600080fd5b50600160a060020a031660009081526002602052604090205490565b60115460a060020a900460ff1681565b600e54600090600160a060020a0316331480611c945750600f54600160a060020a031633145b1515611c9f57600080fd5b5080600160a060020a0381161515611cbf5750600f54600160a060020a03165b60188054600190810190915560198054909101905561159f600080808685612a01565b60145481565b600e54600160a060020a0316331480611d0b5750600f54600160a060020a031633145b1515611d1657600080fd5b601260009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d6957600080fd5b505af1158015611d7d573d6000803e3d6000fd5b50505050601360009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611dd457600080fd5b505af115801561159f573d6000803e3d6000fd5b600e54600160a060020a0316331480611e0b5750600f54600160a060020a031633145b1515611e1657600080fd5b60115460a060020a900460ff1615611e2d57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a179055565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b600c81600e8110611ec157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600e54600090600160a060020a0316331480611f075750600f54600160a060020a031633145b1515611f1257600080fd5b601054611f3090600090819081908790600160a060020a0316612a01565b6012805460008381526001602081905260409091208054600160a060020a031916600160a060020a03938416179055601980549091019055905491925016636d2a7c8b82611f7c612cc3565b6010546040805160e060020a63ffffffff871602815260048101949094526024840192909252600060448401819052620151806064850152600160a060020a03909116608484015267ffffffffffffffff871660a4840152905160c48084019382900301818387803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b50505050505050565b600160a060020a03821633141561202457600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000806000806000806000806000600a8a8154811015156120af57fe5b6000918252602090912060016002909202019081015490544367ffffffffffffffff6801000000000000000084048116918211159e61ffff60c060020a860481169f50929d509084169b5063ffffffff608060020a850481169b5060a060020a850416995060d060020a909304169650945092505050565b600e54600160a060020a031681565b601054600160a060020a031681565b601154600160a060020a031681565b60155481565b600e54600160a060020a031633148061217d5750600f54600160a060020a031633145b151561218857600080fd5b601655565b816121983382612477565b15156121a357600080fd5b6121ae858585610e79565b6121ba85858585612d8c565b1515611b0a57600080fd5b600e54600160a060020a03163314806121e85750600f54600160a060020a031633145b15156121f357600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600080612221836117ac565b600160a060020a039081169416939093149392505050565b606080612245836115e4565b151561225057600080fd5b610e616040805190810160405280601b81526020017f68747470733a2f2f63727970746f666c6f776572732e696f2f762f000000000081525061229285612ef9565b613004565b60115460a060020a900460ff16156122ae57600080fd5b6122b83385612215565b15156122c357600080fd5b6122cc84610da8565b15156122d757600080fd5b6013546122ed90600160a060020a031685610cdb565b601354604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b601254600160a060020a031681565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b7f150b7a020000000000000000000000000000000000000000000000000000000081565b60195481565b601754600160a060020a031681565b600e54600160a060020a031633148061240d5750600f54600160a060020a031633145b151561241857600080fd5b60115460a060020a900460ff16151561243057600080fd5b601754600160a060020a0316151561244757600080fd5b61244f611097565b565b600f54600160a060020a031681565b6040015167ffffffffffffffff4381169116111590565b600080612483836117ac565b905080600160a060020a031684600160a060020a031614806124be575083600160a060020a03166124b384610cc0565b600160a060020a0316145b806124ce57506124ce8185612383565b949350505050565b81600160a060020a03166124e9826117ac565b600160a060020a0316146124fc57600080fd5b600081815260016020526040902054600160a060020a0316156116c95760009081526001602052604090208054600160a060020a031916905550565b60008060006125478585613153565b600084815260076020908152604080832054600160a060020a038916845260069092529091205490935061258290600163ffffffff6131db16565b600160a060020a0386166000908152600660205260409020805491935090839081106125aa57fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156125ea57fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906126219060001983016133e4565b50600093845260076020526040808520859055908452909220555050565b600061264b83836131f2565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b60008184141561269a575060006124ce565b6001830154608060020a900463ffffffff1615806126c757506001850154608060020a900463ffffffff16155b156126d4575060016124ce565b6001850154608060020a900463ffffffff168214806127035750600185015460a060020a900463ffffffff1682145b15612710575060006124ce565b6001830154608060020a900463ffffffff1684148061273f5750600183015460a060020a900463ffffffff1684145b1561274c575060006124ce565b60018581015490840154608060020a9182900463ffffffff90811692909104161480612797575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b156127a4575060006124ce565b6001808601549084015460a060020a900463ffffffff908116608060020a9092041614806127ef57506001858101549084015460a060020a9182900463ffffffff9081169290910416145b156127fc575060006124ce565b506001949350505050565b6000806000806000806000600a8881548110151561282157fe5b90600052602060002090600202019650600a8981548110151561284057fe5b600091825260209091206001600290920201818101549189015490975061ffff60d060020a92839004811697509190041685101561288b57600187015460d060020a900461ffff1694505b60175486548854604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a0390921691638d8b1b88916044808201926020929091908290030181600087803b1580156128fe57600080fd5b505af1158015612912573d6000803e3d6000fd5b505050506040513d602081101561292857600080fd5b50519350612935896117ac565b925061294b89898760010161ffff168787612a01565b9150600a8281548110151561295c57fe5b9060005260206000209060020201905061297587613252565b61297e86613252565b61298781613252565b505050505050505050565b600080808085116129a257600080fd5b600084116129af57600080fd5b600a8054869081106129bd57fe5b90600052602060002090600202019150600a848154811015156129dc57fe5b906000526020600020906002020190506129f882868387612688565b95945050505050565b600080612a0c61340d565b600063ffffffff89168914612a2057600080fd5b63ffffffff88168814612a3257600080fd5b61ffff87168714612a4257600080fd5b612a4b86610d94565b1515612a5657600080fd5b600287049250600d8361ffff161115612a6e57600d92505b50506040805160e08101825285815267ffffffffffffffff42811660208301908152600093830184815263ffffffff808d16606086019081528c82166080870190815261ffff808a1660a089019081528e821660c08a01908152600a80546001810182559b52895160028c027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915597517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9909801805497519551945192519151841660d060020a027fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff9290941660c060020a0279ffff0000000000000000000000000000000000000000000000001993881660a060020a0277ffffffff000000000000000000000000000000000000000019968916608060020a0273ffffffff0000000000000000000000000000000019988d1668010000000000000000026fffffffffffffffff0000000000000000199c909d1667ffffffffffffffff19909b169a909a179a909a169a909a17959095169690961792909216959095171694909417919091169190911790915590919081168114612c3157600080fd5b6000868152600b602090815260409182902083905560608085015160808087015187518651600160a060020a038d16815295860188905263ffffffff938416868801529216928401929092529082015290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1612cb78582613335565b98975050505050505050565b6000806000601260009054906101000a9004600160a060020a0316600160a060020a031663eac9d94c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d1b57600080fd5b505af1158015612d2f573d6000803e3d6000fd5b505050506040513d6020811015612d4557600080fd5b505191506fffffffffffffffffffffffffffffffff82168214612d6757600080fd5b50600281048101662386f26fc10000811015610c1d5750662386f26fc1000092915050565b600080612da185600160a060020a0316613384565b1515612db05760019150612ef0565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612e43578181015183820152602001612e2b565b50505050905090810190601f168015612e705780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b505050506040513d6020811015612ebc57600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b60606000808281851515612f425760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450612ffb565b8593505b8315612f5d57600190920191600a84049350612f46565b826040519080825280601f01601f191660200182016040528015612f8b578160200160208202803883390190505b5091505060001982015b8515612ff757815160001982019160f860020a6030600a8a060102918491908110612fbc57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550612f95565b8194505b50505050919050565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613047578160200160208202803883390190505b50935083925060009150600090505b85518110156130cc57858181518110151561306d57fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561309457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613056565b5060005b84518110156131465784818151811015156130e757fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561310e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016130d0565b5090979650505050505050565b81600160a060020a0316613166826117ac565b600160a060020a03161461317957600080fd5b600160a060020a0382166000908152600260205260409020546131a390600163ffffffff6131db16565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b600080838311156131eb57600080fd5b5050900390565b6000818152602081815260408083208054600160a060020a031916600160a060020a0387169081179091558352600290915290205461323290600161338c565b600160a060020a0390921660009081526002602052604090209190915550565b6014546001820154439190600c9060c060020a900461ffff16600e811061327557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156132a057fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60c060020a90910461ffff161015611735576001818101805461ffff60c060020a80830482169094011690920279ffff0000000000000000000000000000000000000000000000001990921691909117905550565b61333f828261339e565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b6000903b1190565b600082820183811015610e6157600080fd5b6133a8828261263f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b81548183558181111561340857600083815260209020613408918101908301613449565b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b610cbd91905b80821115613463576000815560010161344f565b50905600a165627a7a723058207cc1ac9088c6f0bcdb19cba8d05ec31456cf1d6b9f6925157d63f2c8315e3bbf0029

   Swarm Source:
bzzr://7cc1ac9088c6f0bcdb19cba8d05ec31456cf1d6b9f6925157d63f2c8315e3bbf

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.