Contract 0x8bc67d00253fd60b1afcce88b78820413139f4c6

 

Contract Overview

Balance:
0.01592 Ether

EtherValue:
$2.16 (@ $135.59/ETH)

Token:
TxHash Block Age From To Value [TxFee]
0x4eb873935b85205a046de4f966ae3700706a4b131f3d330f3e7a50ecdbbddbf0(pending)2 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN 0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether(Pending)
0xad0435064b5035fbac9a9fb79533c3ddbe247f2a209d93cf867f67e51869bcbe(pending)13 days 22 hrs ago0xcbb47921c721602cb65b39b38117120eedbf64de IN 0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether(Pending)
0xe33c773e2c9f99cf9051184102d135fb48c889d1796ece215549f2c0f76c3d34741522648 secs ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x5b5c0629dd8c6c459216b5282074f0d8c9059b1a10329cf0bf1130924bca077874152201 min ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0xa77132ace23a3772aaa8dcb2c3bcd2065631bcc621ccd77e46af75e573723a8574152122 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x10613616247acda51a4a89404bfe3b4ff6c39251515a33d79e9a4c95f7c926a474152064 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0xe3582bc413b5c8e0a5242e87bc01f5cc2d826bdc9bb3934e19e268dbd7c9722574152035 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x42e21b405b507c83bd94dc1723d4f82e1bb6b1b00b143c2f6f6843f16c722b2074151966 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0xb300793781445b997886d212bab698593caecfaeeb8a46728137b6ccd27b0a8874151928 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x2d3ad24a6c6f296c357210142e690e6bae19042918201555cde85d430190975074151859 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x822a0b00d2c5a244584ed48a4daec2c6a20d6df06bdfc96bb0191d34f3f638ad741518010 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0xae4433bd60f5438b3f1d8732d6f6a832da10f62f222dda642f7b6a9b3801c0a2741517112 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x485f8e7899ced366179b726ca8ace53bbf6dd71076d9a0a6e762fc32cff3cccc741516213 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x4e5b146586fa247d819c24f8ba964b755cfdca60cb3af6db7b52ffb46e8886c0741515814 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0x8957e0bab753a9776404a8bff6d5cc3a1aebd43c454143d57ae15c20b316802d741515115 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0xbacd73b4abb22ddc4480a45d9ca34246d9dc9132752962fea3b0d3ccb4fd4588741514617 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
0xc4156fc58dfcab4f069649af664e37138371cb390c79092f9028a5816073595c741513420 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00074686
0x5d23c088a1ba4fa1bf8ad27890939df5bb9f31cca7c4dd822ec8e409b1784217741506738 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00037343
0xbec4be5c6c425bfc236369751101254d1400535ba87a54b2907bc19f3c443bd474149731 hr 2 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00074686
0x50ec27f1e7de52143c0855cb9523c670a6f4293c78740122ee7677e5d88659b174148861 hr 21 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00037343
0x7c6ff3fb5ce8e1328c877dc9fa182b7b7660b68ef6253d9896710dcc8f711a7b74147911 hr 41 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00037343
0x39109bf7dc24798be0cb219c24bb4d1488447ff84da0815112f75bc44462e16d74146982 hrs 1 min ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00074686
0x023c871f16394c168478be05ccec1e9437754df414532358168f744b58d37bdf74146062 hrs 22 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00074686
0xbe45dc5023f0c060f5fe17f84d5fc6567967e802c559b2317f49e749db641a6274145342 hrs 40 mins ago0xeee5443ecf75dcc7a06cf7d234c8383c761f7555 IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00037343
0x3f6274c6424b2e93bfc25ad027f42a81957648d78e211493c0b771d093c5c01974144582 hrs 58 mins ago0x5d888449672861064ce7eb2648d80ccddaa54c5d IN  0x8bc67d00253fd60b1afcce88b78820413139f4c60 Ether0.00026601
[ Download CSV Export 

Latest 25 internal transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x9c35bfa382533f3120ec16ae8ca93db51ce837596d893d3942c5883e327eedb1741157513 hrs 47 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xe41e863a19233b17a793e2ae8d96be294983df33e293db51dfbb9972da159d89740923422 hrs 36 mins ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x8108d869b952063dcbdebba10d02e99653845c607ca6a618a77fdff82c34acb874067321 day 7 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x7a3fc0d4e3c5ae113ee43f0389cf4d506d5ba353f93ce04038dc938a07fc132b74065491 day 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x192da24832a8c49d47f59ae0cd4f568cf2429c70d01ee7608ac795897259d9de74064731 day 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x441f6fed063c66095373846377aa4196ccdb1b48d7b63428e0b544febb97dbf674064601 day 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xf06eb54530acf8df1a784a39958c669b8006329713579546d914a1361039041474064461 day 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xd824243de8e5da5dfe8ea3bd94aa5acf38b0405f4d4266f4b8b78cf8cb56eb4f74064431 day 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x097c0bcfb619044df6cc5da1a6870deb540a793350e7701aa28831f6386b352274064351 day 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x293359adc1344c03fa64f33b8e271bf38f213405b3639ecd9345bbfdd5de849d74055571 day 12 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x293359adc1344c03fa64f33b8e271bf38f213405b3639ecd9345bbfdd5de849d74055571 day 12 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xb7c19314bed49bc9bdca1a97fc89a780f46f2cb40.02 Ether
0x930ca9a667ccc750e803aa0b0059784ea8bc321e3c58cbc368ac2ba17a1de21274036681 day 19 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x839cd24b1c8a2ae4d6c6ba9ab9c44a46e6aa2e9ca9db41f71b27a86c6595872574036661 day 19 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x8978b9cad93ede20cc1b6287c782922b64e8eb06e288d85c4ca07ffedc24809474035331 day 19 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xb7a1415ff4085a6aab9362891b0ecd5abb27fb8a036b822109110d85fb2c47c674035241 day 19 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x83d6753189df72a105602b1cad889a8639896a7d8b80f31c6ac30ff42886a10a74035121 day 19 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x0eb15f321672e24417bea00b50298e84bfa455cac4617a0ee5955cec28041c8874029751 day 21 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x875aa1eba57c6ef25b14166e709b2ebd36bc52b5f6fffd3058962dc5235ca1ca74029471 day 21 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xa7ff0862faeb4c53b578f9b2a09387b01efbee62677e537cab31069bb6ab2dfa74025941 day 23 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xfc839e68829fa4db1880db951328de3b859656017e7d8b1ca45f372d9f4eff3674025911 day 23 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x0fdfeda42da32a5fae901b910596a68318a78f25bb2e162ca55a396c7fa10a6a74023811 day 23 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x5443175cb84ea5223354d41422ec0cc8300fbfe4678687f61c6ba1e75390abac74012272 days 4 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0x3cb19eecf14fd918934804f6ba953058b06c32fbe0c34a653553650dcf497a5874012002 days 4 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xd2275e51b732751569dfa0ff969034c6035b4c6f5d32c9dd9f30ba2982e7144674001142 days 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xe99eaebd9b3dc3ad01445a725d72f2615342ad4e0.002 Ether
0xd2275e51b732751569dfa0ff969034c6035b4c6f5d32c9dd9f30ba2982e7144674001142 days 8 hrs ago0x8bc67d00253fd60b1afcce88b78820413139f4c60xb7c19314bed49bc9bdca1a97fc89a780f46f2cb40.011 Ether
[ Download CSV Export 

Contract Source Code Verified (Exact Match)

Contract Name:
FlowerCore

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

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

60c0604052600d60808190527f43727970746f466c6f776572730000000000000000000000000000000000000060a090815262000040916004919062000644565b506040805180820190915260028082527f43460000000000000000000000000000000000000000000000000000000000006020909201918252620000879160059162000644565b50604080516101c081018252603c81526078602082015261012c9181019190915261025860608201526107086080820152610e1060a0820152611c2060c082015261384060e082015261708061010082015261e100610120820152620151806101408201526202a3006101608201526205460061018082015262093a806101a08201526200011a90600c90600e620006c9565b506011805460a060020a60ff0219169055600f60145566071afd498d000060158190556016553480156200014d57600080fd5b506011805460a060020a60ff02191674010000000000000000000000000000000000000000179055600e8054600160a060020a031990811633908117909255600f80549091169091179055620001b36000808060001981640100000000620001ba810204565b50620007e8565b600080620001c762000768565b600063ffffffff89168914620001dc57600080fd5b63ffffffff88168814620001ef57600080fd5b61ffff871687146200020057600080fd5b62000214866401000000006200049d810204565b15156200022057600080fd5b600287049250600d8361ffff1611156200023957600d92505b50506040805160e08101825285815267ffffffffffffffff42811660208301908152600093830184815263ffffffff808d16606086019081528c82166080870190815261ffff808a1660a089019081528e821660c08a01908152600a80546001810182559b52895160028c027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915597517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990980180549751955194519251915184167a0100000000000000000000000000000000000000000000000000000260d060020a61ffff02199290941678010000000000000000000000000000000000000000000000000260c060020a61ffff0219938816740100000000000000000000000000000000000000000260a060020a63ffffffff021996891670010000000000000000000000000000000002608060020a63ffffffff0219988d166801000000000000000002604060020a608060020a03199c909d1667ffffffffffffffff19909b169a909a179a909a169a909a179590951696909617929092169590951716949094179190911691909117909155909190811681146200040057600080fd5b6000868152600b602090815260409182902083905560608085015160808087015187518651600160a060020a038d16815295860188905263ffffffff938416868801529216928401929092529082015290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1620004918582640100000000620004b1810204565b98975050505050505050565b6000908152600b6020526040812054111590565b620004cb82826401000000006200339e6200051082021704565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b62000525828264010000000062000561810204565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200057d8383640100000000620031f2620005ba82021704565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b6000818152602081815260408083208054600160a060020a031916600160a060020a038716908117909155835260029091529020546200060a9060016401000000006200062a81026200338c1704565b600160a060020a0390921660009081526002602052604090209190915550565b6000828201838110156200063d57600080fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200068757805160ff1916838001178555620006b7565b82800160010185558215620006b7579182015b82811115620006b75782518255916020019190600101906200069a565b50620006c5929150620007a4565b5090565b6002830191839082156200075a5791602002820160005b838211156200072657835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620006e0565b8015620007585782816101000a81549063ffffffff021916905560040160208160030104928301926001030262000726565b505b50620006c5929150620007c4565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b620007c191905b80821115620006c55760008155600101620007ab565b90565b620007c191905b80821115620006c557805463ffffffff19168155600101620007cb565b61349380620007f86000396000f3006080604052600436106102db5763ffffffff60e060020a6000350416623ba1ed81146102e05780630168605e1461030357806301ffc9a71461033457806305e455461461036a57806306fdde0314610391578063081812fc1461041b578063095ea7b3146104335780630e583df0146104575780631051db341461046c5780631280177d14610481578063174e7d551461049957806318160ddd146104b157806319c2f201146104c657806323b872dd146104db5780632933199a146105055780632f745c5914610510578063338d8fcf1461053457806335975a3714610549578063377173421461055e5780633d5e92961461056c5780633d7d3f5a1461058d57806342842e0e146105ae57806346d22c70146105d85780634b85fd55146105f35780634f558e791461060b5780634f6ccce7146106235780635663896e1461063b5780635b1fe0cb146106535780635fd8c7101461066a578063624de3d91461067f57806362ac302d146106b15780636352211e146106d25780636a226077146106ea5780636cf1cb29146106f85780636fbde40d14610719578063704b6c021461073a57806370a082311461075b57806375f12b211461077c5780637a530f03146107915780637a7d4937146107b557806391876e57146107ca57806392cf1d49146107df57806395d89b41146107f45780639d6fac6f146108095780639f0e19861461083a578063a22cb4651461085f578063a9203f3c14610885578063aaa2b8c8146108e0578063af39e9dd146108f5578063af8c4bf01461090a578063b0c35c051461091f578063b857ee7214610934578063b88d4fde1461094c578063bb4056c2146109bb578063c5b8f772146109dc578063c87b56dd14610a00578063e074118714610a18578063e6cbe35114610a39578063e985e9c514610a4e578063ecc98ce414610a75578063f1ca941014610a8a578063f2b47d5214610a9f578063f8bd71c714610ab4578063fc6f946814610ac9575b600080fd5b3480156102ec57600080fd5b50610301600160a060020a0360043516610ade565b005b34801561030f57600080fd5b50610318610b43565b60408051600160a060020a039092168252519081900360200190f35b34801561034057600080fd5b50610356600160e060020a031960043516610b52565b604080519115158252519081900360200190f35b34801561037657600080fd5b5061037f610c23565b60408051918252519081900360200190f35b34801561039d57600080fd5b506103a6610c29565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103e05781810151838201526020016103c8565b50505050905090810190601f16801561040d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042757600080fd5b50610318600435610cc0565b34801561043f57600080fd5b50610301600160a060020a0360043516602435610cdb565b34801561046357600080fd5b5061037f610d84565b34801561047857600080fd5b50610356610d8f565b34801561048d57600080fd5b50610356600435610d94565b3480156104a557600080fd5b50610356600435610da8565b3480156104bd57600080fd5b5061037f610e68565b3480156104d257600080fd5b5061037f610e72565b3480156104e757600080fd5b50610301600160a060020a0360043581169060243516604435610e79565b610301600435610f1e565b34801561051c57600080fd5b5061037f600160a060020a0360043516602435611044565b34801561054057600080fd5b5061037f611091565b34801561055557600080fd5b50610301611097565b6103016004356024356110fd565b34801561057857600080fd5b50610301600160a060020a03600435166113a6565b34801561059957600080fd5b50610301600435602435604435606435611472565b3480156105ba57600080fd5b50610301600160a060020a036004358116906024351660443561156d565b3480156105e457600080fd5b506103566004356024356115a5565b3480156105ff57600080fd5b506103016004356115b1565b34801561061757600080fd5b506103566004356115e4565b34801561062f57600080fd5b5061037f600435611601565b34801561064757600080fd5b50610301600435611637565b610301600435600160a060020a036024351661167e565b34801561067657600080fd5b506103016116cd565b34801561068b57600080fd5b50610694611738565b60408051600160e060020a03199092168252519081900360200190f35b3480156106bd57600080fd5b50610301600160a060020a036004351661175c565b3480156106de57600080fd5b506103186004356117ac565b6103016004356024356117d0565b34801561070457600080fd5b50610301600160a060020a0360043516611a4c565b34801561072557600080fd5b50610301600160a060020a0360043516611b11565b34801561074657600080fd5b50610301600160a060020a0360043516611bdd565b34801561076757600080fd5b5061037f600160a060020a0360043516611c2b565b34801561078857600080fd5b50610356611c5e565b34801561079d57600080fd5b50610301600435600160a060020a0360243516611c6e565b3480156107c157600080fd5b5061037f611ce2565b3480156107d657600080fd5b50610301611ce8565b3480156107eb57600080fd5b50610301611de8565b34801561080057600080fd5b506103a6611e53565b34801561081557600080fd5b50610821600435611eb4565b6040805163ffffffff9092168252519081900360200190f35b34801561084657600080fd5b5061030160043567ffffffffffffffff60243516611ee1565b34801561086b57600080fd5b50610301600160a060020a0360043516602435151561200e565b34801561089157600080fd5b5061089d600435612092565b6040805198151589526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156108ec57600080fd5b50610318612127565b34801561090157600080fd5b50610318612136565b34801561091657600080fd5b50610318612145565b34801561092b57600080fd5b5061037f612154565b34801561094057600080fd5b5061030160043561215a565b34801561095857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261030194600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375094975061218d9650505050505050565b3480156109c757600080fd5b50610301600160a060020a03600435166121c5565b3480156109e857600080fd5b50610356600160a060020a0360043516602435612215565b348015610a0c57600080fd5b506103a6600435612239565b348015610a2457600080fd5b50610301600435602435604435606435612297565b348015610a4557600080fd5b50610318612374565b348015610a5a57600080fd5b50610356600160a060020a0360043581169060243516612383565b348015610a8157600080fd5b506106946123b1565b348015610a9657600080fd5b5061037f6123d5565b348015610aab57600080fd5b506103186123db565b348015610ac057600080fd5b506103016123ea565b348015610ad557600080fd5b50610318612451565b600e54600160a060020a0316331480610b015750600f54600160a060020a031633145b1515610b0c57600080fd5b600160a060020a0381161515610b2157600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b601354600160a060020a031681565b6000600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610bb55750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b80610be95750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c1d5750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b60185481565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b820191906000526020600020905b815481529060010190602001808311610c9857829003601f168201915b505050505090505b90565b600090815260016020526040902054600160a060020a031690565b6000610ce6826117ac565b9050600160a060020a038381169082161415610d0157600080fd5b33600160a060020a0382161480610d1d5750610d1d8133612383565b1515610d2857600080fd5b6000828152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b662386f26fc1000081565b600190565b6000908152600b6020526040812054111590565b600080808311610db757600080fd5b600a805484908110610dc557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c0820152909150610e6190612460565b9392505050565b6008546000190190565b6201518081565b80610e843382612477565b1515610e8f57600080fd5b600160a060020a0384161515610ea457600080fd5b600160a060020a0383161515610eb957600080fd5b610ec384836124d6565b610ecd8483612538565b610ed7838361263f565b8183600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60115460a060020a900460ff1615610f3557600080fd5b610f3f3382612215565b1515610f4a57600080fd5b610f5381610da8565b1515610f5e57600080fd5b601654341015610f6d57600080fd5b601154610f85903390600160a060020a031683610e79565b601154604051600160a060020a03909116903480156108fc02916000818181858888f19350505050158015610fbe573d6000803e3d6000fd5b5060408051338152348183018190526060820152608081018390524360a082015260c0602082018190526008908201527f4d616b654769667400000000000000000000000000000000000000000000000060e082015290517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150565b600061104f83611c2b565b821061105a57600080fd5b600160a060020a038316600090815260066020526040902080548390811061107e57fe5b9060005260206000200154905092915050565b60165481565b600e54600160a060020a03163314806110ba5750600f54600160a060020a031633145b15156110c557600080fd5b60115460a060020a900460ff1615156110dd57600080fd5b6011805474ff000000000000000000000000000000000000000019169055565b601154600090819060a060020a900460ff161561111957600080fd5b60155434101561112857600080fd5b6111323385612215565b151561113d57600080fd5b6111473384612215565b151561115257600080fd5b600a80548590811061116057fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529092506111fc90612460565b151561120757600080fd5b600a80548490811061121557fe5b60009182526020918290206040805160e081018252600290930290910180548352600181015467ffffffffffffffff808216958501959095526801000000000000000081049094169183019190915263ffffffff608060020a84048116606084015260a060020a840416608083015261ffff60c060020a8404811660a084015260d060020a90930490921660c08201529091506112b190612460565b15156112bc57600080fd5b6112c882858386612688565b15156112d357600080fd5b6112dd8484612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f19350505050158015611319573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d6f776e000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a150505050565b600e54600090600160a060020a03163314806113cc5750600f54600160a060020a031633145b15156113d757600080fd5b81905080600160a060020a03166312b91aca6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561141857600080fd5b505af115801561142c573d6000803e3d6000fd5b505050506040513d602081101561144257600080fd5b5051151561144f57600080fd5b60138054600160a060020a031916600160a060020a039290921691909117905550565b60115460a060020a900460ff161561148957600080fd5b6114933385612215565b151561149e57600080fd5b6114a784610da8565b15156114b257600080fd5b6012546114c890600160a060020a031685610cdb565b601254604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b5050505050505050565b806115783382612477565b151561158357600080fd5b61159f848484602060405190810160405280600081525061218d565b50505050565b6000610e618383612992565b600e54600160a060020a03163314806115d45750600f54600160a060020a031633145b15156115df57600080fd5b601555565b600090815260208190526040902054600160a060020a0316151590565b600061160b610e68565b82111561161757600080fd5b600880548390811061162557fe5b90600052602060002001549050919050565b600e54600160a060020a031633148061165a5750600f54600160a060020a031633145b151561166557600080fd5b600c5463ffffffff16811061167957600080fd5b601455565b60115460a060020a900460ff161561169557600080fd5b61169f3383612215565b15156116aa57600080fd5b6116b382610da8565b15156116be57600080fd5b6116c9338284610e79565b5050565b600e54600160a060020a03163314806116f05750600f54600160a060020a031633145b15156116fb57600080fd5b600e54604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015611735573d6000803e3d6000fd5b50565b7fb0aa71870000000000000000000000000000000000000000000000000000000081565b600e54600160a060020a031633148061177f5750600f54600160a060020a031633145b151561178a57600080fd5b60178054600160a060020a031916600160a060020a0392909216919091179055565b600081815260208190526040812054600160a060020a0316801515610c1d57600080fd5b60115460009060a060020a900460ff16156117ea57600080fd5b6117f43383612215565b15156117ff57600080fd5b61180882610da8565b151561181357600080fd5b61181c83610da8565b151561182757600080fd5b6118318284612992565b151561183c57600080fd5b601354604080517fc55d0f56000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163c55d0f56916024808201926020929091908290030181600087803b1580156118a357600080fd5b505af11580156118b7573d6000803e3d6000fd5b505050506040513d60208110156118cd57600080fd5b505160155490915081013410156118e357600080fd5b601354601554604080517f9f04996d000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0390931692639f04996d9234039160448082019260009290919082900301818588803b15801561195557600080fd5b505af1158015611969573d6000803e3d6000fd5b50505050506119848263ffffffff168463ffffffff16612807565b601054601554604051600160a060020a039092169181156108fc0291906000818181858888f193505050501580156119c0573d6000803e3d6000fd5b50601554604080513381528082018390526060810192909252608082018590524360a083015260c060208301819052600c908301527f42697274684665652d626964000000000000000000000000000000000000000060e0830152517fe9aedacc72b677369110630875d3947e6bcba15202e2444a09ab0d5e9eacaa78918190036101000190a1505050565b600e54600160a060020a0316331480611a6f5750600f54600160a060020a031633145b1515611a7a57600080fd5b60108054600160a060020a031916600160a060020a03838116918217909255601254604080517f6cf1cb29000000000000000000000000000000000000000000000000000000008152600481019390935251921691636cf1cb299160248082019260009290919082900301818387803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b5050505050565b600e54600090600160a060020a0316331480611b375750600f54600160a060020a031633145b1515611b4257600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b50511515611bba57600080fd5b60128054600160a060020a031916600160a060020a039290921691909117905550565b600e54600160a060020a03163314611bf457600080fd5b600160a060020a0381161515611c0957600080fd5b600f8054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0382161515611c4257600080fd5b50600160a060020a031660009081526002602052604090205490565b60115460a060020a900460ff1681565b600e54600090600160a060020a0316331480611c945750600f54600160a060020a031633145b1515611c9f57600080fd5b5080600160a060020a0381161515611cbf5750600f54600160a060020a03165b60188054600190810190915560198054909101905561159f600080808685612a01565b60145481565b600e54600160a060020a0316331480611d0b5750600f54600160a060020a031633145b1515611d1657600080fd5b601260009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611d6957600080fd5b505af1158015611d7d573d6000803e3d6000fd5b50505050601360009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b158015611dd457600080fd5b505af115801561159f573d6000803e3d6000fd5b600e54600160a060020a0316331480611e0b5750600f54600160a060020a031633145b1515611e1657600080fd5b60115460a060020a900460ff1615611e2d57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a179055565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb55780601f10610c8a57610100808354040283529160200191610cb5565b600c81600e8110611ec157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600e54600090600160a060020a0316331480611f075750600f54600160a060020a031633145b1515611f1257600080fd5b601054611f3090600090819081908790600160a060020a0316612a01565b6012805460008381526001602081905260409091208054600160a060020a031916600160a060020a03938416179055601980549091019055905491925016636d2a7c8b82611f7c612cc3565b6010546040805160e060020a63ffffffff871602815260048101949094526024840192909252600060448401819052620151806064850152600160a060020a03909116608484015267ffffffffffffffff871660a4840152905160c48084019382900301818387803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b50505050505050565b600160a060020a03821633141561202457600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000806000806000806000806000600a8a8154811015156120af57fe5b6000918252602090912060016002909202019081015490544367ffffffffffffffff6801000000000000000084048116918211159e61ffff60c060020a860481169f50929d509084169b5063ffffffff608060020a850481169b5060a060020a850416995060d060020a909304169650945092505050565b600e54600160a060020a031681565b601054600160a060020a031681565b601154600160a060020a031681565b60155481565b600e54600160a060020a031633148061217d5750600f54600160a060020a031633145b151561218857600080fd5b601655565b816121983382612477565b15156121a357600080fd5b6121ae858585610e79565b6121ba85858585612d8c565b1515611b0a57600080fd5b600e54600160a060020a03163314806121e85750600f54600160a060020a031633145b15156121f357600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600080612221836117ac565b600160a060020a039081169416939093149392505050565b606080612245836115e4565b151561225057600080fd5b610e616040805190810160405280601b81526020017f68747470733a2f2f63727970746f666c6f776572732e696f2f762f000000000081525061229285612ef9565b613004565b60115460a060020a900460ff16156122ae57600080fd5b6122b83385612215565b15156122c357600080fd5b6122cc84610da8565b15156122d757600080fd5b6013546122ed90600160a060020a031685610cdb565b601354604080517f6d2a7c8b00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044810185905260648101849052336084820152600060a482018190529151600160a060020a0390931692636d2a7c8b9260c48084019391929182900301818387803b15801561154f57600080fd5b601254600160a060020a031681565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b7f150b7a020000000000000000000000000000000000000000000000000000000081565b60195481565b601754600160a060020a031681565b600e54600160a060020a031633148061240d5750600f54600160a060020a031633145b151561241857600080fd5b60115460a060020a900460ff16151561243057600080fd5b601754600160a060020a0316151561244757600080fd5b61244f611097565b565b600f54600160a060020a031681565b6040015167ffffffffffffffff4381169116111590565b600080612483836117ac565b905080600160a060020a031684600160a060020a031614806124be575083600160a060020a03166124b384610cc0565b600160a060020a0316145b806124ce57506124ce8185612383565b949350505050565b81600160a060020a03166124e9826117ac565b600160a060020a0316146124fc57600080fd5b600081815260016020526040902054600160a060020a0316156116c95760009081526001602052604090208054600160a060020a031916905550565b60008060006125478585613153565b600084815260076020908152604080832054600160a060020a038916845260069092529091205490935061258290600163ffffffff6131db16565b600160a060020a0386166000908152600660205260409020805491935090839081106125aa57fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a03168152602001908152602001600020848154811015156125ea57fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906126219060001983016133e4565b50600093845260076020526040808520859055908452909220555050565b600061264b83836131f2565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b60008184141561269a575060006124ce565b6001830154608060020a900463ffffffff1615806126c757506001850154608060020a900463ffffffff16155b156126d4575060016124ce565b6001850154608060020a900463ffffffff168214806127035750600185015460a060020a900463ffffffff1682145b15612710575060006124ce565b6001830154608060020a900463ffffffff1684148061273f5750600183015460a060020a900463ffffffff1684145b1561274c575060006124ce565b60018581015490840154608060020a9182900463ffffffff90811692909104161480612797575060018086015490840154608060020a900463ffffffff90811660a060020a90920416145b156127a4575060006124ce565b6001808601549084015460a060020a900463ffffffff908116608060020a9092041614806127ef57506001858101549084015460a060020a9182900463ffffffff9081169290910416145b156127fc575060006124ce565b506001949350505050565b6000806000806000806000600a8881548110151561282157fe5b90600052602060002090600202019650600a8981548110151561284057fe5b600091825260209091206001600290920201818101549189015490975061ffff60d060020a92839004811697509190041685101561288b57600187015460d060020a900461ffff1694505b60175486548854604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a0390921691638d8b1b88916044808201926020929091908290030181600087803b1580156128fe57600080fd5b505af1158015612912573d6000803e3d6000fd5b505050506040513d602081101561292857600080fd5b50519350612935896117ac565b925061294b89898760010161ffff168787612a01565b9150600a8281548110151561295c57fe5b9060005260206000209060020201905061297587613252565b61297e86613252565b61298781613252565b505050505050505050565b600080808085116129a257600080fd5b600084116129af57600080fd5b600a8054869081106129bd57fe5b90600052602060002090600202019150600a848154811015156129dc57fe5b906000526020600020906002020190506129f882868387612688565b95945050505050565b600080612a0c61340d565b600063ffffffff89168914612a2057600080fd5b63ffffffff88168814612a3257600080fd5b61ffff87168714612a4257600080fd5b612a4b86610d94565b1515612a5657600080fd5b600287049250600d8361ffff161115612a6e57600d92505b50506040805160e08101825285815267ffffffffffffffff42811660208301908152600093830184815263ffffffff808d16606086019081528c82166080870190815261ffff808a1660a089019081528e821660c08a01908152600a80546001810182559b52895160028c027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881019190915597517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9909801805497519551945192519151841660d060020a027fffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff9290941660c060020a0279ffff0000000000000000000000000000000000000000000000001993881660a060020a0277ffffffff000000000000000000000000000000000000000019968916608060020a0273ffffffff0000000000000000000000000000000019988d1668010000000000000000026fffffffffffffffff0000000000000000199c909d1667ffffffffffffffff19909b169a909a179a909a169a909a17959095169690961792909216959095171694909417919091169190911790915590919081168114612c3157600080fd5b6000868152600b602090815260409182902083905560608085015160808087015187518651600160a060020a038d16815295860188905263ffffffff938416868801529216928401929092529082015290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a1612cb78582613335565b98975050505050505050565b6000806000601260009054906101000a9004600160a060020a0316600160a060020a031663eac9d94c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d1b57600080fd5b505af1158015612d2f573d6000803e3d6000fd5b505050506040513d6020811015612d4557600080fd5b505191506fffffffffffffffffffffffffffffffff82168214612d6757600080fd5b50600281048101662386f26fc10000811015610c1d5750662386f26fc1000092915050565b600080612da185600160a060020a0316613384565b1515612db05760019150612ef0565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015612e43578181015183820152602001612e2b565b50505050905090810190601f168015612e705780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e9257600080fd5b505af1158015612ea6573d6000803e3d6000fd5b505050506040513d6020811015612ebc57600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b60606000808281851515612f425760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450612ffb565b8593505b8315612f5d57600190920191600a84049350612f46565b826040519080825280601f01601f191660200182016040528015612f8b578160200160208202803883390190505b5091505060001982015b8515612ff757815160001982019160f860020a6030600a8a060102918491908110612fbc57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550612f95565b8194505b50505050919050565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613047578160200160208202803883390190505b50935083925060009150600090505b85518110156130cc57858181518110151561306d57fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561309457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613056565b5060005b84518110156131465784818151811015156130e757fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561310e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016130d0565b5090979650505050505050565b81600160a060020a0316613166826117ac565b600160a060020a03161461317957600080fd5b600160a060020a0382166000908152600260205260409020546131a390600163ffffffff6131db16565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b600080838311156131eb57600080fd5b5050900390565b6000818152602081815260408083208054600160a060020a031916600160a060020a0387169081179091558352600290915290205461323290600161338c565b600160a060020a0390921660009081526002602052604090209190915550565b6014546001820154439190600c9060c060020a900461ffff16600e811061327557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156132a057fe5b6001840180546fffffffffffffffff0000000000000000191668010000000000000000939092049390930167ffffffffffffffff16919091021790819055600d60c060020a90910461ffff161015611735576001818101805461ffff60c060020a80830482169094011690920279ffff0000000000000000000000000000000000000000000000001990921691909117905550565b61333f828261339e565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b6000903b1190565b600082820183811015610e6157600080fd5b6133a8828261263f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b81548183558181111561340857600083815260209020613408918101908301613449565b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b610cbd91905b80821115613463576000815560010161344f565b50905600a165627a7a723058207cc1ac9088c6f0bcdb19cba8d05ec31456cf1d6b9f6925157d63f2c8315e3bbf0029

Swarm Source

bzzr://7cc1ac9088c6f0bcdb19cba8d05ec31456cf1d6b9f6925157d63f2c8315e3bbf
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.