ETH Price: $1,870.08 (-1.57%)

Contract

0x0A2eA71d943BF917b410593194595e1f48d40e54
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer79082192019-06-06 22:05:392122 days ago1559858739IN
0x0A2eA71d...f48d40e54
0 ETH0.000189633
Approve60772612018-08-02 22:08:082430 days ago1533247688IN
0x0A2eA71d...f48d40e54
0 ETH0.000138843
Create New Aucti...58469142018-06-24 16:15:442469 days ago1529856944IN
0x0A2eA71d...f48d40e54
0 ETH0.000190161
Create New Pop58467212018-06-24 15:27:342469 days ago1529854054IN
0x0A2eA71d...f48d40e54
0 ETH0.000165741
Clone With Two P...58403712018-06-23 13:44:532470 days ago1529761493IN
0x0A2eA71d...f48d40e54
0 ETH0.000190011
Clone With Two P...58166842018-06-19 12:23:372474 days ago1529411017IN
0x0A2eA71d...f48d40e54
0 ETH0.000556563
Sell Genes58118922018-06-18 16:46:312475 days ago1529340391IN
0x0A2eA71d...f48d40e54
0 ETH0.000297482
Approve58113992018-06-18 14:44:422475 days ago1529333082IN
0x0A2eA71d...f48d40e54
0 ETH0.000046281
Approve58109332018-06-18 12:55:192475 days ago1529326519IN
0x0A2eA71d...f48d40e54
0 ETH0.000046281
Sell Pop58100362018-06-18 9:12:432476 days ago1529313163IN
0x0A2eA71d...f48d40e54
0 ETH0.000134921
Clone With Two P...58099492018-06-18 8:48:282476 days ago1529311708IN
0x0A2eA71d...f48d40e54
0 ETH0.000417552
Sell Genes58099482018-06-18 8:48:062476 days ago1529311686IN
0x0A2eA71d...f48d40e54
0 ETH0.000267612
Sell Genes58099442018-06-18 8:46:302476 days ago1529311590IN
0x0A2eA71d...f48d40e54
0 ETH0.000297482
Sell Genes58099432018-06-18 8:46:262476 days ago1529311586IN
0x0A2eA71d...f48d40e54
0 ETH0.000297482
Sell Genes58099412018-06-18 8:45:272476 days ago1529311527IN
0x0A2eA71d...f48d40e54
0 ETH0.000297482
Sell Genes58099392018-06-18 8:45:142476 days ago1529311514IN
0x0A2eA71d...f48d40e54
0 ETH0.000297482
Sell Genes58099362018-06-18 8:44:502476 days ago1529311490IN
0x0A2eA71d...f48d40e54
0 ETH0.000297482
Sell Pop58081122018-06-18 1:18:542476 days ago1529284734IN
0x0A2eA71d...f48d40e54
0 ETH0.000149921
Sell Pop58081102018-06-18 1:18:312476 days ago1529284711IN
0x0A2eA71d...f48d40e54
0 ETH0.000149921
Sell Pop58081092018-06-18 1:18:152476 days ago1529284695IN
0x0A2eA71d...f48d40e54
0 ETH0.000149921
Clone With Two P...58080982018-06-18 1:15:562476 days ago1529284556IN
0x0A2eA71d...f48d40e54
0 ETH0.000185631
Clone With Two P...58080932018-06-18 1:14:382476 days ago1529284478IN
0x0A2eA71d...f48d40e54
0 ETH0.000185481
Clone With Two P...58080882018-06-18 1:13:022476 days ago1529284382IN
0x0A2eA71d...f48d40e54
0 ETH0.000189941
Sell Pop58080602018-06-18 1:08:272476 days ago1529284107IN
0x0A2eA71d...f48d40e54
0 ETH0.000090081
Sell Genes58080592018-06-18 1:08:162476 days ago1529284096IN
0x0A2eA71d...f48d40e54
0 ETH0.000297612
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
REPOPCore

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-05-04
*/

pragma solidity ^0.4.21;

/// @author Luis Freitas, Miguel Amaral (https://repop.world)
contract REPOPAccessControl {
    address public ceoAddress;
    address public cfoAddress;
    address public cooAddress;

    bool public paused = false;

    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    modifier onlyCFO() {
        require(msg.sender == cfoAddress);
        _;
    }

    modifier onlyCOO() {
        require(msg.sender == cooAddress);
        _;
    }

    modifier onlyCLevel() {
        require(
            msg.sender == cooAddress ||
            msg.sender == ceoAddress ||
            msg.sender == cfoAddress
        );
        _;
    }

    function setCEO(address _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    function setCFO(address _newCFO) external onlyCEO {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }

    function setCOO(address _newCOO) external onlyCEO {
        require(_newCOO != address(0));

        cooAddress = _newCOO;
    }

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

    modifier whenPaused {
        require(paused);
        _;
    }

    function pause() external onlyCLevel whenNotPaused {
        paused = true;
    }

    function unpause() public onlyCEO whenPaused {

        paused = false;
    }
}

contract PullPayment {
  mapping(address => uint) public payments;

  function asyncSend(address dest, uint amount) internal {
    payments[dest] += amount;
  }

  function withdrawPayments() external {
    uint payment = payments[msg.sender];
    payments[msg.sender] = 0;
    if (!msg.sender.send(payment)) {
      payments[msg.sender] = payment;
    }
  }
}


/// @author Dieter Shirley <[email protected]> (https://github.com/dete)
contract ERC721 {

  function approve(address _to, uint256 _tokenId) public;
  function balanceOf(address _owner) public view returns (uint256 balance);
  function implementsERC721() public pure returns (bool);
  function ownerOf(uint256 _tokenId) public view returns (address addr);
  function takeOwnership(uint256 _tokenId) public;
  function totalSupply() public view returns (uint256 total);
  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function transfer(address _to, uint256 _tokenId) public;
  function tokenMetadata(uint256 _tokenId) public view returns (string infoUrl);

  event Transfer(address indexed from, address indexed to, uint256 tokenId);
  event Approval(address indexed owner, address indexed approved, uint256 tokenId);
  function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

library SafeMath {

  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws 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;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract MetadataContract{

    function getMetadata(uint256 _tokenId) public view returns (bytes32[4] buffer, uint256 count) {
        buffer[0] = "https://meta.repop.world/";
        buffer[1] = uintToBytes(_tokenId);
        count = 64;
    }

      function _memcpy(uint _dest, uint _src, uint _len) private view {

        for(; _len >= 32; _len -= 32) {
            assembly {
                mstore(_dest, mload(_src))
            }
            _dest += 32;
            _src += 32;
        }

        uint256 mask = 256 ** (32 - _len) - 1;
        assembly {
            let srcpart := and(mload(_src), not(mask))
            let destpart := and(mload(_dest), mask)
            mstore(_dest, or(destpart, srcpart))
        }
    }

    function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {
        var outputString = new string(_stringLength);
        uint256 outputPtr;
        uint256 bytesPtr;

        assembly {
            outputPtr := add(outputString, 32)
            bytesPtr := _rawBytes
        }

        _memcpy(outputPtr, bytesPtr, _stringLength);

        return outputString;
    }

    function getMetadataUrl(uint256 _tokenId) external view returns (string infoUrl) {
        bytes32[4] memory buffer;
        uint256 count;
        (buffer, count) = getMetadata(_tokenId);

        return _toString(buffer, count);
    }

    function uintToBytes(uint v) public view returns (bytes32 ret) {
        if (v == 0) {
            ret = '0';
        }
        else {
            while (v > 0) {
                ret = bytes32(uint(ret) / (2 ** 8));
                ret |= bytes32(((v % 10) + 48) * 2 ** (8 * 31));
                v /= 10;
            }
        }
        return ret;
    }
}


/// @author Luis Freitas, Miguel Amaral (https://repop.world)
contract REPOPERC721 is ERC721, REPOPAccessControl{

  MetadataContract public metadataContract;

  bytes4 constant InterfaceSignature_ERC165 =
      bytes4(keccak256('supportsInterface(bytes4)'));

  bytes4 constant InterfaceSignature_ERC721 =
      bytes4(keccak256('name()')) ^
      bytes4(keccak256('symbol()')) ^
      bytes4(keccak256('totalSupply()')) ^
      bytes4(keccak256('balanceOf(address)')) ^
      bytes4(keccak256('ownerOf(uint256)')) ^
      bytes4(keccak256('approve(address,uint256)')) ^
      bytes4(keccak256('transfer(address,uint256)')) ^
      bytes4(keccak256('transferFrom(address,address,uint256)')) ^
      bytes4(keccak256('tokensOfOwner(address)')) ^
      bytes4(keccak256('tokenMetadata(uint256)'));

    function tokenMetadata(uint256 _tokenId) public view returns (string infoUrl) {
      require(metadataContract != address(0));
      require(_tokenId >= 0 && _tokenId <= pops.length);

      return metadataContract.getMetadataUrl(_tokenId);
    }

    function setMetadataContractAddress(address contractAddress) public onlyCEO{
      require(contractAddress != address(0));
      metadataContract = MetadataContract(contractAddress);
    }

    string public constant name = "REPOP WORLD";
    string public constant symbol = "POP";

    function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    {
        return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));
    }

    function approve(address _to, uint256 _tokenId) public whenNotPaused{

        require(_owns(msg.sender, _tokenId));

        popIndexToApproved[_tokenId] = _to;

        emit Approval(msg.sender, _to, _tokenId);
    }

    function balanceOf(address _owner) public view returns (uint256 balance){
        return ownershipTokenCount[_owner];
    }

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

    function ownerOf(uint256 _tokenId) public view returns (address owner) {
        owner = popIndexToOwner[_tokenId];
        require(owner != address(0));
    }

    function takeOwnership(uint256 _tokenId) public {
        address currentOwner = ownerOf(_tokenId);
        address newOwner = msg.sender;

        require(_addressNotNull(newOwner));
        require(_approved(newOwner, _tokenId));

        _transfer(newOwner, _tokenId);
        emit Transfer(currentOwner, newOwner, _tokenId);
    }

    function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {

            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 totalPops = totalSupply();
            uint256 resultIndex = 0;
            uint256 popId;

            for (popId = 1; popId <= totalPops; popId++) {
                if (popIndexToOwner[popId] == _owner) {
                    result[resultIndex] = popId;
                    resultIndex++;
                }
            }
            return result;
        }
    }

    function totalSupply() public view returns (uint256 total) {
        return pops.length;
    }

    function transfer(address _to, uint256 _tokenId ) public whenNotPaused{
      require(_owns(msg.sender, _tokenId));
      require(_addressNotNull(_to));

      _transfer(_to, _tokenId);

      emit Transfer(msg.sender, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public whenNotPaused{
        require(_owns(_from, _tokenId));
        require(_approved(msg.sender, _tokenId));
        require(_addressNotNull(_to));

        _transfer(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }


    function _addressNotNull(address _to) private pure returns (bool){
        return _to != address(0);
    }

    function _approved(address _to, uint256 _tokenId) private view returns (bool) {
        return popIndexToApproved[_tokenId] == _to;
    }

    function _owns(address claimant, uint256 _tokenId) private view returns (bool) {
        return claimant == popIndexToOwner[_tokenId];
    }

    function _transfer(address _to, uint256 _tokenID) internal {
        address owner = popIndexToOwner[_tokenID];
        ownershipTokenCount[owner] = ownershipTokenCount[owner] - 1 ;
        popIndexToApproved[_tokenID] = 0;
        popIndexToOwner[_tokenID] = _to;
        ownershipTokenCount[_to] = ownershipTokenCount[_to] + 1;
    }

    event Birth(address owner, uint256 popId, uint256 aParentId, uint256 bParentId, uint256 genes);
    event Transfer(address from, address to, uint256 tokenId);

    struct Pop {
      uint256 genes;
      uint64 birthTime;
      uint64 cooldownEndTimestamp;
      uint32 aParentId;
      uint32 bParentId;
      bytes32 popName;
      uint16 cooldownIndex;
      uint16 generation;
    }

    uint32[14] public cooldowns = [
        uint32(10 minutes),
        uint32(20 minutes),
        uint32(40 minutes),
        uint32(1 hours),
        uint32(2 hours),
        uint32(3 hours),
        uint32(4 hours),
        uint32(5 hours),
        uint32(6 hours),
        uint32(12 hours),
        uint32(1 days),
        uint32(3 days),
        uint32(5 days),
        uint32(7 days)
    ];

    Pop[] public pops;

    mapping (uint256 => address) public popIndexToOwner;
    mapping (address => uint256) public ownershipTokenCount;
    mapping (uint256 => address) public popIndexToApproved;
    mapping (uint256 => uint256) public genesToTokenId;

    function getPop(uint256 _popId) public view
                    returns (
                                bool isReady,
                                uint256 genes,
                                uint64 birthTime,
                                uint64 cooldownEndTimestamp,
                                uint32 aParentId,
                                uint32 bParentId,
                                bytes32 popName,
                                uint16 cooldownIndex,
                                uint16 generation){
        Pop memory pop = pops[_popId];
        return(
                isReady = (pop.cooldownEndTimestamp <= now),
                pop.genes,
                pop.birthTime,
                pop.cooldownEndTimestamp,
                pop.aParentId,
                pop.bParentId,
                pop.popName,
                pop.cooldownIndex,
                pop.generation);
    }


    function createNewPop(uint256 genes, string popName) public onlyCLevel whenNotPaused{
        bytes32 name32 = stringToBytes32(popName);
        uint256 index = pops.push(Pop(genes,uint64(now),1,0,0,name32,0,0)) -1;

        emit Birth(msg.sender,index,0,0,genes);

        genesToTokenId[genes] = index;

        popIndexToOwner[index] = msg.sender;
        ownershipTokenCount[msg.sender] = ownershipTokenCount[msg.sender]+1;
    }

    function _triggerCooldown(Pop storage _pop) internal {
        _pop.cooldownEndTimestamp = uint64(now + cooldowns[_pop.cooldownIndex]);
    }

    function stringToBytes32(string memory source) internal pure returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
        assembly {
            result := mload(add(source, 32))
        }
    }

    function setPopNameOriginal(uint256 popId, string newName) external onlyCLevel{
      Pop storage pop = pops[popId];
      require(pop.generation == 0);
      bytes32 name32 = stringToBytes32(newName);
      pop.popName = name32;
    }

    function setDNA(uint256 popId, uint256 newDna) external onlyCLevel{
      require(_owns(msg.sender, popId));
      Pop storage pop = pops[popId];
      pop.genes = newDna;
    }

}

contract CarefulTransfer {
    uint constant suggestedExtraGasToIncludeWithSends = 23000;

    function carefulSendWithFixedGas(
        address _toAddress,
        uint _valueWei,
        uint _extraGasIncluded
    ) internal returns (bool success) {
        return _toAddress.call.value(_valueWei).gas(_extraGasIncluded)();
    }
}

contract MoneyManager is PullPayment, CarefulTransfer, REPOPAccessControl {

    function _repopTransaction(address _receiver, uint256 _amountWei, uint256 _marginPerThousandForDevelopers) internal {
        uint256 commissionWei = (_amountWei * _marginPerThousandForDevelopers) / 1000;
        uint256 compensationWei = _amountWei - commissionWei;

        if( ! carefulSendWithFixedGas(_receiver,compensationWei,23000)) {
            asyncSend(_receiver, compensationWei);
        }
    }

    function withdraw(uint amount) external onlyCFO {
        require(amount < address(this).balance);
        cfoAddress.transfer(amount);
    }

    function getBalance() public view returns (uint256 balance) {
        return address(this).balance;
    }
}

library RoundMoneyNicely {
    function roundMoneyDownNicely(uint _rawValueWei) internal pure
    returns (uint nicerValueWei) {
        if (_rawValueWei < 1 finney) {
            return _rawValueWei;
        } else if (_rawValueWei < 10 finney) {
            return 10 szabo * (_rawValueWei / 10 szabo);
        } else if (_rawValueWei < 100 finney) {
            return 100 szabo * (_rawValueWei / 100 szabo);
        } else if (_rawValueWei < 1 ether) {
            return 1 finney * (_rawValueWei / 1 finney);
        } else if (_rawValueWei < 10 ether) {
            return 10 finney * (_rawValueWei / 10 finney);
        } else if (_rawValueWei < 100 ether) {
            return 100 finney * (_rawValueWei / 100 finney);
        } else if (_rawValueWei < 1000 ether) {
            return 1 ether * (_rawValueWei / 1 ether);
        } else if (_rawValueWei < 10000 ether) {
            return 10 ether * (_rawValueWei / 10 ether);
        } else {
            return _rawValueWei;
        }
    }

    function roundMoneyUpToWholeFinney(uint _valueWei) pure internal
    returns (uint valueFinney) {
        return (1 finney + _valueWei - 1 wei) / 1 finney;
    }
}

contract AuctionManager is MoneyManager {
    event Bid(address bidder, uint256 bid, uint256 auctionId);
    event NewAuction( uint256 itemForAuctionID, uint256 durationSeconds, address seller);
    event NewAuctionWinner(address highestBidder, uint256 auctionId);

    struct Auction{
        uint auctionStart;
        uint auctionEnd;
        uint highestBid;
        address highestBidder;
        bool ended;
    }

    bool public isAuctionManager = true;
    uint256 private marginPerThousandForDevelopers = 50;
    uint256 private percentageBidIncrease = 33;
    uint256 private auctionsStartBid = 0.1 ether;
    address private auctionsStartAddress;

    mapping (uint256 => uint256) public _itemID2auctionID;
    mapping (uint256 => uint256) public _auctionID2itemID;
    Auction[] public _auctionsArray;

    ERC721 public nonFungibleContract;

    function AuctionManager() public {
        ceoAddress = msg.sender;
        cooAddress = msg.sender;
        cfoAddress = msg.sender;

        auctionsStartAddress = msg.sender;
        _auctionsArray.push(Auction(0,0,0,0,false));
    }

    function setERCContract(address candidateAddress) public onlyCEO {
        ERC721 candidateContract = ERC721(candidateAddress);

        nonFungibleContract = candidateContract;
    }

    function getERCContractAddress() public view returns (address) {
        return address(nonFungibleContract);
    }

    function getAllActiveAuctions()  external view returns (uint256[] popsIDs,uint256[] auctionsIDs,uint256[] sellingPrices, address[] highestBidders, bool[] canBeEnded){

        uint256[] memory toReturnPopsIDs = new uint256[](_auctionsArray.length);
        uint256[] memory toReturnAuctionsIDs = new uint256[](_auctionsArray.length);
        uint256[] memory toReturnSellingPrices = new uint256[](_auctionsArray.length);
        address[] memory toReturnSellerAddress = new address[](_auctionsArray.length);
        bool[] memory toReturnCanBeEnded = new bool[](_auctionsArray.length);
        uint256 index = 0;

        for(uint256 i = 1; i < _auctionsArray.length; i++){
            uint256 popId = _auctionID2itemID[i];
            uint256 price = requiredBid(i);

            if(_auctionsArray[i].ended == false){
                toReturnPopsIDs[index] = popId;
                toReturnAuctionsIDs[index] = i;
                toReturnSellingPrices[index] = price;
                toReturnSellerAddress[index] = _auctionsArray[i].highestBidder;
                toReturnCanBeEnded[index] = _auctionsArray[i].auctionEnd < now;
                index++;
            }
        }
        return (toReturnPopsIDs,toReturnAuctionsIDs,toReturnSellingPrices,toReturnSellerAddress,toReturnCanBeEnded);
    }

    function getAllAuctions()  external view returns (uint256[] popsIDs,uint256[] auctionsIDs,uint256[] sellingPrices){

        uint256[] memory toReturnPopsIDs = new uint256[](_auctionsArray.length);
        uint256[] memory toReturnAuctionsIDs = new uint256[](_auctionsArray.length);
        uint256[] memory toReturnSellingPrices = new uint256[](_auctionsArray.length);

        uint256 index = 0;

        for(uint256 i = 1; i < _auctionsArray.length; i++){
            uint256 popId = _auctionID2itemID[i];
            uint256 price = requiredBid(i);
            toReturnPopsIDs[index] = popId;
            toReturnAuctionsIDs[index] = i;
            toReturnSellingPrices[index] = price;
            index++;
        }
        return (toReturnPopsIDs,toReturnAuctionsIDs,toReturnSellingPrices);
    }


    function createAuction(uint256 _itemForAuctionID, uint256 _auctionDurationSeconds, address _seller) public {
        require(msg.sender == getERCContractAddress());
        require(_auctionDurationSeconds >= 20 seconds);
        require(_auctionDurationSeconds < 45 days);
        require(_itemForAuctionID != 0);
        require(_seller != 0);

        _takeOwnershipOfTokenFrom(_itemForAuctionID,_seller);

        uint256 auctionEnd = SafeMath.add(now,_auctionDurationSeconds);
        uint256 auctionID = _itemID2auctionID[_itemForAuctionID];
        if(auctionID == 0){
            uint256 index = _auctionsArray.push(Auction(now, auctionEnd, 0, _seller, false)) - 1;
            _itemID2auctionID[_itemForAuctionID] = index;
            _auctionID2itemID[index] = _itemForAuctionID;
        } else {
            Auction storage previousAuction = _auctionsArray[auctionID];
            require(previousAuction.ended == true);
            previousAuction.auctionStart = now;
            previousAuction.auctionEnd = auctionEnd;
            previousAuction.highestBidder = _seller;
            previousAuction.highestBid = 0;
            previousAuction.ended = false;
        }
        emit NewAuction(_itemForAuctionID, _auctionDurationSeconds, _seller);
    }

    function bid(uint auctionID) public payable whenNotPaused{
        require(auctionID != 0);
        Auction storage auction = _auctionsArray[auctionID];
        require(auction.ended == false);
        require(auction.auctionEnd >= now);
        uint claimBidPrice = requiredBid(auctionID);
        uint256 bidValue = msg.value;
        require(bidValue >= claimBidPrice);
        address previousHighestBidder = auction.highestBidder;
        auction.highestBid = msg.value;
        auction.highestBidder = msg.sender;
        _repopTransaction(previousHighestBidder, msg.value, marginPerThousandForDevelopers);
        emit Bid(msg.sender, msg.value, auctionID);
    }

    function endAuction(uint auctionID) public{
        require(auctionID != 0);
        Auction storage auction = _auctionsArray[auctionID];
        require(auction.ended == false);
        require(auction.auctionEnd < now);
        auction.ended = true;
        nonFungibleContract.transfer(auction.highestBidder, _auctionID2itemID[auctionID]);
        emit NewAuctionWinner(auction.highestBidder, auctionID);
    }

    function requiredBid(uint _auctionID) constant public returns (uint256 amountToOutBid) {
        require(_auctionID != 0);
        Auction memory auction = _auctionsArray[_auctionID];
        if(auction.highestBid == 0){
            return auctionsStartBid;
        } else {
            uint256 amountRequiredToOutBid = (auction.highestBid * (100 + percentageBidIncrease)) / 100;
            amountRequiredToOutBid = RoundMoneyNicely.roundMoneyDownNicely(amountRequiredToOutBid);
            return amountRequiredToOutBid;
        }
    }

    function getAuction(uint _itemForAuctionID) external constant returns (uint256 itemID, uint256 auctionStart, uint256 auctionEnd, address highestBidder, uint256 highestBid, bool ended){
        require(_itemForAuctionID != 0);
        Auction memory auction = _auctionsArray[_itemID2auctionID[_itemForAuctionID]];
        if(auction.highestBidder != 0) {
            itemID = _itemForAuctionID;
            auctionStart =  auction.auctionStart;
            auctionEnd =    auction.auctionEnd;
            highestBidder = auction.highestBidder;
            highestBid =    auction.highestBid;
            ended =         auction.ended;
            return(itemID,auctionStart,auctionEnd,highestBidder,highestBid,ended);
        } else {
            revert();
        }
    }

    function getAuctionStartBid() public view returns(uint256){
      return auctionsStartBid;
    }

    function setAuctionStartBid(uint256 _auctionStartBid) public onlyCLevel{
      auctionsStartBid = _auctionStartBid;
    }

    function _addressNotNull(address _to) private pure returns (bool){
        return _to != address(0);
    }


    function _takeOwnershipOfToken(uint256 _itemForAuctionID) internal {

        nonFungibleContract.takeOwnership(_itemForAuctionID);
    }

    function _takeOwnershipOfTokenFrom(uint256 _itemForAuctionID, address previousOwner) internal {
        nonFungibleContract.transferFrom(previousOwner,this,_itemForAuctionID);
    }
}

contract MarketManager is MoneyManager {
    event PopPurchased(address seller, address buyer, uint256 popId, uint256 sellingPrice);
    event PopCancelSale(address popOwner, uint256 popId);
    event PopChangedPrice(address popOwner, uint256 popId, uint256 newPrice);

    struct Sale {
        uint256 sellingPrice;

        address seller;
    }

    bool public isMarketManager = true;
    uint256 private marginPerThousandForDevelopers = 50;
    uint256 private MAX_SELLING_PRICE = 100000 ether;
    mapping (uint256 => uint256) public _itemID2saleID;
    mapping (uint256 => uint256) public _saleID2itemID;
    Sale[] public _salesArray;
    ERC721 public nonFungibleContract;

    function MarketManager() public {
        ceoAddress = msg.sender;
        cooAddress = msg.sender;
        cfoAddress = msg.sender;
        _salesArray.push(Sale(0,0));
        _itemID2saleID[0] = 0;
        _saleID2itemID[0] = 0;
    }

    function setERCContract(address candidateAddress) public onlyCEO {
        require(candidateAddress != address(0));
        ERC721 candidateContract = ERC721(candidateAddress);
        nonFungibleContract = candidateContract;
    }

    function getERCContractAddress() public view returns (address) {
        return address(nonFungibleContract);
    }

    function getAllActiveSales()  external view returns (uint256[] popsIDs,uint256[] sellingPrices,address[] sellerAddresses){

        uint256[] memory toReturnPopsIDs = new uint256[](_salesArray.length);
        uint256[] memory toReturnSellingPrices = new uint256[](_salesArray.length);
        address[] memory toReturnSellerAddress = new address[](_salesArray.length);
        uint256 index = 0;

        for(uint256 i = 1; i < _salesArray.length; i++){
            uint256 popId = _saleID2itemID[i];
            uint256 price = _salesArray[i].sellingPrice;
            address seller = _salesArray[i].seller;

            if(seller != 0){
                toReturnSellerAddress[index] = seller;
                toReturnPopsIDs[index] = popId;
                toReturnSellingPrices[index] = price;
                index++;
            }
        }
        return (toReturnPopsIDs,toReturnSellingPrices,toReturnSellerAddress);
    }

    function getAllSalesByAddress(address addr)  external view returns (uint256[] popsIDs,uint256[] sellingPrices,address[] sellerAddresses){

        uint256[] memory toReturnPopsIDs = new uint256[](_salesArray.length);
        uint256[] memory toReturnSellingPrices = new uint256[](_salesArray.length);
        address[] memory toReturnSellerAddress = new address[](_salesArray.length);
        uint256 index = 0;

        for(uint256 i = 1; i < _salesArray.length; i++){
            uint256 popId = _saleID2itemID[i];
            uint256 price = _salesArray[i].sellingPrice;
            address seller = _salesArray[i].seller;

            if(seller == addr){
                toReturnSellerAddress[index] = seller;
                toReturnPopsIDs[index] = popId;
                toReturnSellingPrices[index] = price;
                index++;
            }
        }
        return (toReturnPopsIDs,toReturnSellingPrices,toReturnSellerAddress);
    }

    function purchasePop(uint256 _popId) public payable whenNotPaused{
        uint256 saleID = _itemID2saleID[_popId];
        require(saleID != 0);
        Sale storage sale = _salesArray[saleID];
        address popOwner = sale.seller;
        require(popOwner != 0);
        address newOwner = msg.sender;
        uint256 sellingPrice = sale.sellingPrice;
        require(popOwner != newOwner);
        require(_addressNotNull(newOwner));
        require(msg.value == sellingPrice);
        sale.seller = 0;
        nonFungibleContract.transfer(newOwner,_popId);
        _repopTransaction(popOwner, msg.value, marginPerThousandForDevelopers);
        emit PopPurchased(popOwner, msg.sender, _popId, msg.value);
    }

    function sellerOf(uint _popId) public view returns (address) {
        uint256 saleID = _itemID2saleID[_popId];
        Sale memory sale = _salesArray[saleID];
        return sale.seller;
    }

    function sellPop(address seller, uint256 _popId, uint256 _sellingPrice) public whenNotPaused{
        require(_sellingPrice < MAX_SELLING_PRICE);
        require(msg.sender == getERCContractAddress());
        require(_sellingPrice > 0);
        _takeOwnershipOfTokenFrom(_popId,seller);
        uint256 saleID = _itemID2saleID[_popId];
        if(saleID == 0) {
            uint256  index = _salesArray.push(Sale(_sellingPrice,seller)) - 1;
            _itemID2saleID[_popId] = index;
            _saleID2itemID[index] = _popId;
        } else {
            Sale storage sale = _salesArray[saleID];
            require(sale.seller == 0);
            sale.seller = seller;
            sale.sellingPrice = _sellingPrice;
        }
    }

    function cancelSellPop(uint256 _popId) public {
        Sale storage sale = _salesArray[_itemID2saleID[_popId]];
        require(sale.seller == msg.sender);
        sale.seller = 0;
        nonFungibleContract.transfer(msg.sender,_popId);

        emit PopCancelSale(msg.sender, _popId);
    }

    function changeSellPOPPrice(uint256 _popId, uint256 _newSellingValue) public whenNotPaused{
      require(_newSellingValue < MAX_SELLING_PRICE);
      require(_newSellingValue > 0);
      Sale storage sale = _salesArray[_itemID2saleID[_popId]];
      require(sale.seller == msg.sender);
      sale.sellingPrice = _newSellingValue;
      emit PopChangedPrice(msg.sender, _popId, _newSellingValue);
    }

    function _addressNotNull(address _to) private pure returns (bool){
        return _to != address(0);
    }

    function _takeOwnershipOfToken(uint256 _itemForAuctionID) internal {
        nonFungibleContract.takeOwnership(_itemForAuctionID);
    }

    function _takeOwnershipOfTokenFrom(uint256 _itemForAuctionID, address previousOwner) internal {
        nonFungibleContract.transferFrom(previousOwner,this,_itemForAuctionID);
    }
}

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

contract GenesMarket is MoneyManager {
    event GenesCancelSale(address popOwner, uint256 popId);
    event GenesPurchased(address buyer, address popOwner, uint256 popId, uint256 amount, uint256 price);
    event GenesChangedPrice(address popOwner, uint256 popId, uint256 newPrice);

    struct GeneForSale {
            uint256 sellingPrice;
            address currentOwner;
    }

    mapping (uint256 => uint256) public _itemID2geneSaleID;
    mapping (uint256 => uint256) public _geneSaleID2itemID;
    GeneForSale[] public _genesForSaleArray;
    uint256 marginPerThousandForDevelopers = 50;
    uint256 MAX_SELLING_PRICE = 10000 ether;

    mapping(address => mapping (uint256 => uint256)) _genesOwned;
    mapping(address => uint256[]) _ownedGenesPopsId;
    bool public isGenesMarket = true;

    function GenesMarket() public {
        ceoAddress = msg.sender;
        cooAddress = msg.sender;
        cfoAddress = msg.sender;
        _genesForSaleArray.push(GeneForSale(0,0));
    }

    ERC721 public nonFungibleContract;
    function setERCContract(address candidateAddress) public onlyCEO() {
        ERC721 candidateContract = ERC721(candidateAddress);
        nonFungibleContract = candidateContract;
    }

    function getERCContractAddress() public view returns (address) {
        return address(nonFungibleContract);
    }

    function startSellingGenes(uint256 _popId, uint256 _sellingPrice, address _seller) public {
        require(_sellingPrice < MAX_SELLING_PRICE);
        require(msg.sender == getERCContractAddress());
        require(_sellingPrice > 0);
        _takeOwnershipOfTokenFrom(_popId,_seller);
        uint256 geneSaleID = _itemID2geneSaleID[_popId];
        if(geneSaleID == 0){

            uint256 index = _genesForSaleArray.push(GeneForSale(_sellingPrice,_seller)) - 1;
            _itemID2geneSaleID[_popId] = index;
            _geneSaleID2itemID[index] = _popId;

        }else {
            GeneForSale storage previousSale = _genesForSaleArray[geneSaleID];
            previousSale.sellingPrice = _sellingPrice;
            previousSale.currentOwner = _seller;
        }
    }

    function stopSellingGenes(uint _popId) public {
        uint256 geneSaleID = _itemID2geneSaleID[_popId];
        require(geneSaleID != 0);
        GeneForSale storage gene = _genesForSaleArray[geneSaleID];
        require(msg.sender == gene.currentOwner);
        require(gene.sellingPrice != 0);
        gene.sellingPrice = 0;
        nonFungibleContract.transfer(gene.currentOwner, _popId);

        emit GenesCancelSale(msg.sender, _popId);
    }


    function sellerOf(uint _popId) public view returns (address) {
        uint256 geneSaleID = _itemID2geneSaleID[_popId];
        GeneForSale memory gene = _genesForSaleArray[geneSaleID];
        if(gene.sellingPrice != 0) {
            return gene.currentOwner;
        } else {
            return 0;
        }
    }

    function useBottle(address _user, uint _popId) external whenNotPaused {
        require(msg.sender == getERCContractAddress());
        require(_genesOwned[_user][_popId] > 0);
        _genesOwned[_user][_popId] = _genesOwned[_user][_popId] - 1;
    }


    function purchaseGenes(uint256 _popId, uint256 _amountGenes, bool update) public payable whenNotPaused{
        require(_amountGenes > 0);
        uint256 geneSaleID = _itemID2geneSaleID[_popId];
        GeneForSale memory gene = _genesForSaleArray[geneSaleID];
        require(gene.sellingPrice != 0);
        address popOwner = gene.currentOwner;
        address genesReceiver = msg.sender;
        uint256 sellingPrice = gene.sellingPrice;
        require(popOwner != genesReceiver);
        require(msg.value == SafeMath.mul(sellingPrice, _amountGenes));
        if( update && _genesOwned[msg.sender][_popId] == 0) {
            _ownedGenesPopsId[msg.sender].push(_popId);
        }
        _genesOwned[msg.sender][_popId] = _genesOwned[msg.sender][_popId] + _amountGenes;
        _repopTransaction(popOwner, msg.value, marginPerThousandForDevelopers);
        emit GenesPurchased(msg.sender, popOwner, _popId, _amountGenes, msg.value);
    }

    function getGenesForSale() public view returns (uint[] popIDs, uint[] sellingPrices, uint[] geneSaleIDs, address[] sellers){
        uint256[] memory toReturnPopsIDs = new uint256[](_genesForSaleArray.length);
        uint256[] memory toReturnSellingPrices = new uint256[](_genesForSaleArray.length);
        uint256[] memory toReturnGeneSaleID = new uint256[](_genesForSaleArray.length);
        address[] memory toReturnSellers = new address[](_genesForSaleArray.length);
        uint256 index = 0;

        for(uint256 i = 1; i < _genesForSaleArray.length; i++){
            uint256 popId = _geneSaleID2itemID[i];
            uint256 price = _genesForSaleArray[i].sellingPrice;

            if(price != 0){
                toReturnGeneSaleID[index] = i;
                toReturnPopsIDs[index] = popId;
                toReturnSellingPrices[index] = price;
                toReturnSellers[index] = _genesForSaleArray[i].currentOwner;
                index++;
            }
        }
        return (toReturnPopsIDs,toReturnSellingPrices,toReturnGeneSaleID, toReturnSellers);
    }

    function getGenesForSaleBySeller(address seller) public view returns (uint[] popIDs, uint[] sellingPrices, uint[] geneSaleIDs, address[] sellers){
        uint256[] memory toReturnPopsIDs = new uint256[](_genesForSaleArray.length);
        uint256[] memory toReturnSellingPrices = new uint256[](_genesForSaleArray.length);
        uint256[] memory toReturnGeneSaleID = new uint256[](_genesForSaleArray.length);
        address[] memory toReturnSellers = new address[](_genesForSaleArray.length);
        uint256 index = 0;

        for(uint256 i = 1; i < _genesForSaleArray.length; i++){
            uint256 popId = _geneSaleID2itemID[i];
            uint256 price = _genesForSaleArray[i].sellingPrice;

            if(price != 0){
              if(_genesForSaleArray[i].currentOwner == seller){
                toReturnGeneSaleID[index] = i;
                toReturnPopsIDs[index] = popId;
                toReturnSellingPrices[index] = price;
                toReturnSellers[index] = _genesForSaleArray[i].currentOwner;
                index++;
              }
            }
        }
        return (toReturnPopsIDs,toReturnSellingPrices,toReturnGeneSaleID, toReturnSellers);
    }

    function getAmountOfGene(uint _popId) public view returns (uint amount){
        return _genesOwned[msg.sender][_popId];
    }

    function getMyGenes() public view returns (uint[] popIDs, uint[] amount) {
        uint256[] memory toReturnPopsIDs = new uint256[](_ownedGenesPopsId[msg.sender].length);
        uint256[] memory toReturnAmount = new uint256[](_ownedGenesPopsId[msg.sender].length);

        for(uint256 i = 0; i < _ownedGenesPopsId[msg.sender].length; i++) {
            toReturnPopsIDs[i] = _ownedGenesPopsId[msg.sender][i];
            toReturnAmount[i] = _genesOwned[msg.sender][_ownedGenesPopsId[msg.sender][i]];
        }
        return (toReturnPopsIDs,toReturnAmount);
    }

    function changeSellGenesPrice(uint256 _popId, uint256 _newSellingValue) public whenNotPaused{
      require(_newSellingValue < MAX_SELLING_PRICE);
      require(_newSellingValue > 0);
      uint256 geneSaleID = _itemID2geneSaleID[_popId];
      require(geneSaleID != 0);

      GeneForSale storage gene = _genesForSaleArray[geneSaleID];

      require(msg.sender == gene.currentOwner);
      require(gene.sellingPrice != 0);

      gene.sellingPrice = _newSellingValue;

      emit GenesChangedPrice(msg.sender, _popId, _newSellingValue);
    }

    function _takeOwnershipOfTokenFrom(uint256 _popId, address previousOwner) internal {
        nonFungibleContract.transferFrom(previousOwner,this,_popId);
    }
}

contract REPOPCore is REPOPERC721, MoneyManager{
    uint256 public refresherFee = 0.01 ether;
    AuctionManager public auctionManager;
    MarketManager public marketManager;
    GenesMarket public genesMarket;
    CloningInterface public geneScience;

    event CloneWithTwoPops(address creator, uint256 cloneId, uint256 aParentId, uint256 bParentId);
    event CloneWithPopAndBottle(address creator, uint256 cloneId, uint256 popId, uint256 bottleId);
    event SellingPop(address seller, uint256 popId, uint256 price);
    event SellingGenes(address seller, uint256 popId, uint256 price);
    event ChangedPopName(address owner, uint256 popId, bytes32 newName);
    event CooldownRemoval(uint256 popId, address owner, uint256 paidFee);

    function REPOPCore() public{

      ceoAddress = msg.sender;
      cooAddress = msg.sender;
      cfoAddress = msg.sender;

      createNewPop(0x0, "Satoshi Nakamoto");
    }

    function createNewAuction(uint256 _itemForAuctionID, uint256 _auctionDurationSeconds) public onlyCLevel{
        approve(address(auctionManager),_itemForAuctionID);
        auctionManager.createAuction(_itemForAuctionID,_auctionDurationSeconds,msg.sender);
    }

    function setAuctionManagerAddress(address _address) external onlyCEO {
        AuctionManager candidateContract = AuctionManager(_address);


        require(candidateContract.isAuctionManager());


        auctionManager = candidateContract;
    }

    function getAuctionManagerAddress() public view returns (address) {
        return address(auctionManager);
    }

    function setMarketManagerAddress(address _address) external onlyCEO {
        MarketManager candidateContract = MarketManager(_address);
        require(candidateContract.isMarketManager());
        marketManager = candidateContract;
    }

    function getMarketManagerAddress() public view returns (address) {
        return address(marketManager);
    }

    function setGeneScienceAddress(address _address) external onlyCEO {
      CloningInterface candidateContract = CloningInterface(_address);
      require(candidateContract.isGeneScience());
      geneScience = candidateContract;
    }

    function getGeneScienceAddress() public view returns (address) {
        return address(geneScience);
    }

    function setGenesMarketAddress(address _address) external onlyCEO {
      GenesMarket candidateContract = GenesMarket(_address);
      require(candidateContract.isGenesMarket());
      genesMarket = candidateContract;
    }

    function getGenesMarketAddress() public view returns (address) {
        return address(genesMarket);
    }

    function sellPop(uint256 _popId, uint256 _price) public {
        Pop storage pop = pops[_popId];
        require(pop.cooldownEndTimestamp <= now);
        approve(address(marketManager),_popId);
        marketManager.sellPop(msg.sender,_popId,_price);
        emit SellingPop(msg.sender, _popId, _price);
    }

    function sellGenes(uint256 _popId, uint256 _price) public {
        require(_popId > 0);
        approve(address(genesMarket),_popId);
        genesMarket.startSellingGenes(_popId,_price,msg.sender);
        emit SellingGenes(msg.sender, _popId, _price);
    }

    function getOwnerInAnyPlatformById(uint256 popId) public view returns (address){
      if(ownerOf(popId) == address(marketManager)){
        return marketManager.sellerOf(popId);
      }
      else if(ownerOf(popId) == address(genesMarket)){
        return genesMarket.sellerOf(popId);
      }
      else if(ownerOf(popId) == address(auctionManager)){
        return ceoAddress;
      }
      else{
        return ownerOf(popId);
      }
      return 0x0;
    }

    function setPopName(uint256 popId, string newName) external {
      require(_ownerOfPopInAnyPlatform(popId));
      Pop storage pop = pops[popId];
      require(pop.generation > 0);
      bytes32 name32 = stringToBytes32(newName);
      pop.popName = name32;
      emit ChangedPopName(msg.sender, popId, name32);
    }

    function removeCooldown(uint256 popId)
      external
      payable
      {
        require(_ownerOfPopInAnyPlatform(popId));
        require(msg.value >= refresherFee);
        Pop storage pop = pops[popId];
        pop.cooldownEndTimestamp = 1;
        emit CooldownRemoval(popId, msg.sender, refresherFee);
      }

    function _ownerOfPopInAnyPlatform(uint _popId) internal view returns (bool) {
      return ownerOf(_popId) == msg.sender || genesMarket.sellerOf(_popId) == msg.sender || marketManager.sellerOf(_popId) == msg.sender;
    }

    function getOwnershipForCloning(uint _popId) internal view returns (bool) {
        return ownerOf(_popId) == msg.sender || genesMarket.sellerOf(_popId) == msg.sender;
    }

    function changeRefresherFee(uint256 _newFee) public onlyCLevel{
        refresherFee = _newFee;
    }

    function cloneWithTwoPops(uint256 _aParentId, uint256 _bParentId)
      external
      whenNotPaused
      returns (uint256)
      {
        require(_aParentId > 0);
        require(_bParentId > 0);
        require(getOwnershipForCloning(_aParentId));
        require(getOwnershipForCloning(_bParentId));
        Pop storage aParent = pops[_aParentId];

        Pop storage bParent = pops[_bParentId];

        require(aParent.genes != bParent.genes);
        require(aParent.cooldownEndTimestamp <= now);
        require(bParent.cooldownEndTimestamp <= now);

        uint16 parentGen = aParent.generation;
        if (bParent.generation > aParent.generation) {
            parentGen = bParent.generation;
        }

        uint16 cooldownIndex = parentGen + 1;
        if (cooldownIndex > 13) {
            cooldownIndex = 13;
        }

        uint256 childGenes = geneScience.mixGenes(aParent.genes, bParent.genes);

        _triggerCooldown(aParent);
        _triggerCooldown(bParent);

        uint256 index = pops.push(Pop(childGenes,uint64(now), 1, uint32(_aParentId), uint32(_bParentId), 0, cooldownIndex, parentGen + 1)) -1;

        popIndexToOwner[index] = msg.sender;
        ownershipTokenCount[msg.sender] = ownershipTokenCount[msg.sender]+1;

        emit CloneWithTwoPops(msg.sender, index, _aParentId, _bParentId);
        emit Birth(msg.sender, index, _aParentId, _bParentId,childGenes);

        return index;
    }

    function cloneWithPopAndBottle(uint256 _aParentId, uint256 _bParentId_bottle)
        external
        whenNotPaused
        returns (uint256)
        {
          require(_aParentId > 0);
          require(getOwnershipForCloning(_aParentId));
          Pop storage aParent = pops[_aParentId];
          Pop memory bParent = pops[_bParentId_bottle];

          require(aParent.genes != bParent.genes);
          require(aParent.cooldownEndTimestamp <= now);

          uint16 parentGen = aParent.generation;
          if (bParent.generation > aParent.generation) {
              parentGen = bParent.generation;
          }

          uint16 cooldownIndex = parentGen + 1;
          if (cooldownIndex > 13) {
              cooldownIndex = 13;
          }

          genesMarket.useBottle(msg.sender, _bParentId_bottle);

          uint256 childGenes = geneScience.mixGenes(aParent.genes, bParent.genes);

          _triggerCooldown(aParent);

          uint256 index = pops.push(Pop(childGenes,uint64(now), 1, uint32(_aParentId), uint32(_bParentId_bottle), 0, cooldownIndex, parentGen + 1)) -1;

          popIndexToOwner[index] = msg.sender;
          ownershipTokenCount[msg.sender] = ownershipTokenCount[msg.sender]+1;

          emit CloneWithPopAndBottle(msg.sender, index, _aParentId, _bParentId_bottle);
          emit Birth(msg.sender, index, _aParentId, _bParentId_bottle, childGenes);

          return index;
        }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"genesToTokenId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"popId","type":"uint256"},{"name":"newName","type":"string"}],"name":"setPopNameOriginal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"genes","type":"uint256"},{"name":"popName","type":"string"}],"name":"createNewPop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_popId","type":"uint256"},{"name":"_price","type":"uint256"}],"name":"sellGenes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"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":"getBalance","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGenesMarketAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_popId","type":"uint256"}],"name":"getPop","outputs":[{"name":"isReady","type":"bool"},{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint64"},{"name":"cooldownEndTimestamp","type":"uint64"},{"name":"aParentId","type":"uint32"},{"name":"bParentId","type":"uint32"},{"name":"popName","type":"bytes32"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"}],"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":true,"inputs":[],"name":"getMarketManagerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setGeneScienceAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"popId","type":"uint256"}],"name":"getOwnerInAnyPlatformById","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"metadataContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"popId","type":"uint256"},{"name":"newName","type":"string"}],"name":"setPopName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"marketManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contractAddress","type":"address"}],"name":"setMetadataContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"genesMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_popId","type":"uint256"},{"name":"_price","type":"uint256"}],"name":"sellPop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawPayments","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"popIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenMetadata","outputs":[{"name":"infoUrl","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getGenesMarketAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setMarketManagerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"popId","type":"uint256"}],"name":"removeCooldown","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_aParentId","type":"uint256"},{"name":"_bParentId","type":"uint256"}],"name":"cloneWithTwoPops","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"popId","type":"uint256"},{"name":"newDna","type":"uint256"}],"name":"setDNA","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"cooldowns","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"popIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_aParentId","type":"uint256"},{"name":"_bParentId_bottle","type":"uint256"}],"name":"cloneWithPopAndBottle","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"auctionManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"refresherFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newFee","type":"uint256"}],"name":"changeRefresherFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setAuctionManagerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ownershipTokenCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"payments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"pops","outputs":[{"name":"genes","type":"uint256"},{"name":"birthTime","type":"uint64"},{"name":"cooldownEndTimestamp","type":"uint64"},{"name":"aParentId","type":"uint32"},{"name":"bParentId","type":"uint32"},{"name":"popName","type":"bytes32"},{"name":"cooldownIndex","type":"uint16"},{"name":"generation","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_itemForAuctionID","type":"uint256"},{"name":"_auctionDurationSeconds","type":"uint256"}],"name":"createNewAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionManagerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getGeneScienceAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"geneScience","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"creator","type":"address"},{"indexed":false,"name":"cloneId","type":"uint256"},{"indexed":false,"name":"aParentId","type":"uint256"},{"indexed":false,"name":"bParentId","type":"uint256"}],"name":"CloneWithTwoPops","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"creator","type":"address"},{"indexed":false,"name":"cloneId","type":"uint256"},{"indexed":false,"name":"popId","type":"uint256"},{"indexed":false,"name":"bottleId","type":"uint256"}],"name":"CloneWithPopAndBottle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"seller","type":"address"},{"indexed":false,"name":"popId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"SellingPop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"seller","type":"address"},{"indexed":false,"name":"popId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"SellingGenes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"popId","type":"uint256"},{"indexed":false,"name":"newName","type":"bytes32"}],"name":"ChangedPopName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"popId","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"paidFee","type":"uint256"}],"name":"CooldownRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"popId","type":"uint256"},{"indexed":false,"name":"aParentId","type":"uint256"},{"indexed":false,"name":"bParentId","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":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"}]

6003805460a060020a60ff021916905561024060405261025860809081526104b060a05261096060c052610e1060e052611c2061010052612a306101205261384061014052614650610160526154606101805261a8c06101a052620151806101c0526203f4806101e052620697806102005262093a80610220526200008990600590600e62000443565b50662386f26fc10000600c55348015620000a257600080fd5b5060018054600160a060020a033316600160a060020a031991821681179092556003805482168317905560028054909116909117905560408051808201909152601081527f5361746f736869204e616b616d6f746f000000000000000000000000000000006020820152620001239060009064010000000062000129810204565b6200050d565b600354600090819033600160a060020a03908116911614806200015a575060015433600160a060020a039081169116145b8062000174575060025433600160a060020a039081169116145b15156200018057600080fd5b60035474010000000000000000000000000000000000000000900460ff1615620001a957600080fd5b620001bd836401000000006200041d810204565b91506001600761010060405190810160405280878152602001426001604060020a0316815260200160016001604060020a03168152602001600063ffffffff168152602001600063ffffffff16815260200185600019168152602001600061ffff168152602001600061ffff16815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000015560208201518160010160006101000a8154816001604060020a0302191690836001604060020a0316021790555060408201518160010160086101000a8154816001604060020a0302191690836001604060020a0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a0820151816002019060001916905560c08201518160030160006101000a81548161ffff021916908361ffff16021790555060e08201518160030160026101000a81548161ffff021916908361ffff16021790555050500390507f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad53382600080886040518086600160a060020a0316600160a060020a031681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16000938452600b60209081526040808620839055918552600881528185208054600160a060020a03191633600160a060020a0316908117909155855260099052909220805460010190555050565b8051600090829015156200043557600091506200043d565b602083015191505b50919050565b600283019183908215620004d45791602002820160005b83821115620004a057835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026200045a565b8015620004d25782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620004a0565b505b50620004e2929150620004e6565b5090565b6200050a91905b80821115620004e257805463ffffffff19168155600101620004ed565b90565b613545806200051d6000396000f3006080604052600436106102b05763ffffffff60e060020a60003504166301b0c6e081146102b557806301ffc9a7146102df5780630479fcd01461032a5780630519ce791461035057806306fdde03146103815780630762c3171461040b578063095ea7b31461046957806309b70ad01461048d5780630a0f8168146104a85780631051db34146104bd57806312065fe0146104d257806318160ddd146104e757806319b466fa146104fc5780631d862a811461051d57806323b872dd14610596578063242db433146105c057806324e7a38a146105d557806327d7874c146105f65780632ba73c15146106175780632e1a7d4d1461063857806332be9502146106505780633520982114610668578063386e0d751461067d5780633f4ba83a146106a157806341ed2c12146106b65780634d74d3b4146106cb5780634ddad616146106ec5780634e0a3379146107015780635422cf34146107225780635c975abb1461073d5780636103d70b146107525780636352211e14610767578063672498541461077f5780636914db601461079757806370a08231146107af5780637d236928146107d0578063822f005a146107e55780638456cb59146108065780638462151c1461081b5780638a6508ce1461088c57806395d89b4114610897578063966588d4146108ac578063983a7f47146108c75780639d6fac6f146108e25780639eeab9c714610913578063a9059cbb1461092b578063aa056d2a1461094f578063b0192f9a1461096a578063b047fb501461097f578063b07741fd14610994578063b2e6ceeb146109a9578063c0f4f41e146109c1578063cd7dc52d146109d9578063cec21acb146109fa578063e2982c2114610a1b578063eb28a51514610a3c578063ee7e203914610ab2578063ef98dea314610acd578063f129c5d714610ae2578063f2b47d5214610af7575b600080fd5b3480156102c157600080fd5b506102cd600435610b0c565b60408051918252519081900360200190f35b3480156102eb57600080fd5b506103167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610b1e565b604080519115158252519081900360200190f35b34801561033657600080fd5b5061034e600480359060248035908101910135610db3565b005b34801561035c57600080fd5b50610365610e89565b60408051600160a060020a039092168252519081900360200190f35b34801561038d57600080fd5b50610396610e98565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d05781810151838201526020016103b8565b50505050905090810190601f1680156103fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041757600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261034e958335953695604494919390910191908190840183828082843750949750610ecf9650505050505050565b34801561047557600080fd5b5061034e600160a060020a03600435166024356111a9565b34801561049957600080fd5b5061034e60043560243561123e565b3480156104b457600080fd5b5061036561133c565b3480156104c957600080fd5b5061031661134b565b3480156104de57600080fd5b506102cd611350565b3480156104f357600080fd5b506102cd61135e565b34801561050857600080fd5b5061034e600160a060020a0360043516611364565b34801561052957600080fd5b5061053560043561141d565b604080519915158a5260208a019890985267ffffffffffffffff9687168989015294909516606088015263ffffffff9283166080880152911660a086015260c085015261ffff91821660e08501521661010083015251908190036101200190f35b3480156105a257600080fd5b5061034e600160a060020a03600435811690602435166044356115c7565b3480156105cc57600080fd5b50610365611675565b3480156105e157600080fd5b5061034e600160a060020a0360043516611684565b34801561060257600080fd5b5061034e600160a060020a036004351661173d565b34801561062357600080fd5b5061034e600160a060020a036004351661178f565b34801561064457600080fd5b5061034e6004356117e1565b34801561065c57600080fd5b50610365600435611850565b34801561067457600080fd5b506103656119b6565b34801561068957600080fd5b5061034e6004803590602480359081019101356119c5565b3480156106ad57600080fd5b5061034e611aaa565b3480156106c257600080fd5b50610365611afd565b3480156106d757600080fd5b5061034e600160a060020a0360043516611b0c565b3480156106f857600080fd5b50610365611b5e565b34801561070d57600080fd5b5061034e600160a060020a0360043516611b6d565b34801561072e57600080fd5b5061034e600435602435611bbf565b34801561074957600080fd5b50610316611d03565b34801561075e57600080fd5b5061034e611d13565b34801561077357600080fd5b50610365600435611d71565b34801561078b57600080fd5b50610365600435611d95565b3480156107a357600080fd5b50610396600435611db0565b3480156107bb57600080fd5b506102cd600160a060020a0360043516611eda565b3480156107dc57600080fd5b50610365611ef5565b3480156107f157600080fd5b5061034e600160a060020a0360043516611f04565b34801561081257600080fd5b5061034e611fbd565b34801561082757600080fd5b5061083c600160a060020a0360043516612049565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610878578181015183820152602001610860565b505050509050019250505060405180910390f35b61034e60043561211b565b3480156108a357600080fd5b506103966121da565b3480156108b857600080fd5b506102cd600435602435612211565b3480156108d357600080fd5b5061034e600435602435612717565b3480156108ee57600080fd5b506108fa6004356127a4565b6040805163ffffffff9092168252519081900360200190f35b34801561091f57600080fd5b506103656004356127d1565b34801561093757600080fd5b5061034e600160a060020a03600435166024356127ec565b34801561095b57600080fd5b506102cd600435602435612884565b34801561097657600080fd5b50610365612e4b565b34801561098b57600080fd5b50610365612e5a565b3480156109a057600080fd5b506102cd612e69565b3480156109b557600080fd5b5061034e600435612e6f565b3480156109cd57600080fd5b5061034e600435612f02565b3480156109e557600080fd5b5061034e600160a060020a0360043516612f56565b348015610a0657600080fd5b506102cd600160a060020a036004351661300f565b348015610a2757600080fd5b506102cd600160a060020a0360043516613021565b348015610a4857600080fd5b50610a54600435613033565b6040805198895267ffffffffffffffff97881660208a0152959096168786015263ffffffff938416606088015291909216608086015260a085019190915261ffff90811660c08501529190911660e083015251908190036101000190f35b348015610abe57600080fd5b5061034e6004356024356130ba565b348015610ad957600080fd5b506103656131b0565b348015610aee57600080fd5b506103656131bf565b348015610b0357600080fd5b506103656131ce565b600b6020526000908152604090205481565b604080517f737570706f727473496e74657266616365286279746573342900000000000000815290519081900360190190206000907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1983811691161480610dab5750604080517f746f6b656e4d657461646174612875696e7432353629000000000000000000008152815190819003601690810182207f746f6b656e734f664f776e657228616464726573732900000000000000000000835283519283900390910182207f7472616e7366657246726f6d28616464726573732c616464726573732c75696e83527f7432353629000000000000000000000000000000000000000000000000000000602084015283519283900360250183207f7472616e7366657228616464726573732c75696e743235362900000000000000845284519384900360190184207f617070726f766528616464726573732c75696e74323536290000000000000000855285519485900360180185207f6f776e65724f662875696e743235362900000000000000000000000000000000865286519586900360100186207f62616c616e63654f662861646472657373290000000000000000000000000000875287519687900360120187207f746f74616c537570706c792829000000000000000000000000000000000000008852885197889003600d0188207f73796d626f6c2829000000000000000000000000000000000000000000000000895289519889900360080189207f6e616d65282900000000000000000000000000000000000000000000000000008a529951988990036006019098207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198c811691909a189098181818181818181891909116145b90505b919050565b600354600090819033600160a060020a0390811691161480610de3575060015433600160a060020a039081169116145b80610dfc575060025433600160a060020a039081169116145b1515610e0757600080fd5b6007805486908110610e1557fe5b60009182526020909120600490910201600381015490925062010000900461ffff1615610e4157600080fd5b610e7a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437506131dd945050505050565b60029092019190915550505050565b600254600160a060020a031681565b60408051808201909152600b81527f5245504f5020574f524c44000000000000000000000000000000000000000000602082015281565b600354600090819033600160a060020a0390811691161480610eff575060015433600160a060020a039081169116145b80610f18575060025433600160a060020a039081169116145b1515610f2357600080fd5b60035460a060020a900460ff1615610f3a57600080fd5b610f43836131dd565b915060016007610100604051908101604052808781526020014267ffffffffffffffff168152602001600167ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff16815260200185600019168152602001600061ffff168152602001600061ffff16815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a0820151816002019060001916905560c08201518160030160006101000a81548161ffff021916908361ffff16021790555060e08201518160030160026101000a81548161ffff021916908361ffff16021790555050500390507f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad53382600080886040518086600160a060020a0316600160a060020a031681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16000938452600b60209081526040808620839055918552600881528185208054600160a060020a03191633600160a060020a0316908117909155855260099052909220805460010190555050565b60035460a060020a900460ff16156111c057600080fd5b6111ca3382613201565b15156111d557600080fd5b6000818152600a60209081526040918290208054600160a060020a031916600160a060020a0386811691821790925583518581529351909333909216927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35050565b6000821161124b57600080fd5b600f5461126190600160a060020a0316836111a9565b600f54604080517f7c37605c0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052600160a060020a03338116604483015291519190921691637c37605c91606480830192600092919082900301818387803b1580156112d657600080fd5b505af11580156112ea573d6000803e3d6000fd5b505060408051600160a060020a03331681526020810186905280820185905290517f2acb6fff53b285dad2e80f11ca04ecc39506a3f0da4962f82a57bf06cf9c0c1c9350908190036060019150a15050565b600154600160a060020a031681565b600190565b600160a060020a0330163190565b60075490565b60015460009033600160a060020a0390811691161461138257600080fd5b81905080600160a060020a03166373a699ad6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156113c357600080fd5b505af11580156113d7573d6000803e3d6000fd5b505050506040513d60208110156113ed57600080fd5b505115156113fa57600080fd5b600f8054600160a060020a031916600160a060020a039290921691909117905550565b60008060008060008060008060006114336134d5565b600780548c90811061144157fe5b90600052602060002090600402016101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154600019166000191681526020016003820160009054906101000a900461ffff1661ffff1661ffff1681526020016003820160029054906101000a900461ffff1661ffff1661ffff1681525050905042816040015167ffffffffffffffff161115995089816000015182602001518360400151846060015185608001518660a001518760c001518860e00151995099509950995099509950995099509950509193959799909294969850565b60035460a060020a900460ff16156115de57600080fd5b6115e88382613201565b15156115f357600080fd5b6115fd3382613221565b151561160857600080fd5b61161182613241565b151561161c57600080fd5b611626828261324f565b60408051600160a060020a0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b600e54600160a060020a031690565b60015460009033600160a060020a039081169116146116a257600080fd5b81905080600160a060020a03166354c15b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156116e357600080fd5b505af11580156116f7573d6000803e3d6000fd5b505050506040513d602081101561170d57600080fd5b5051151561171a57600080fd5b60108054600160a060020a031916600160a060020a039290921691909117905550565b60015433600160a060020a0390811691161461175857600080fd5b600160a060020a038116151561176d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146117aa57600080fd5b600160a060020a03811615156117bf57600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b60025433600160a060020a039081169116146117fc57600080fd5b600160a060020a03301631811061181257600080fd5b600254604051600160a060020a039091169082156108fc029083906000818181858888f1935050505015801561184c573d6000803e3d6000fd5b5050565b600e54600090600160a060020a031661186883611d71565b600160a060020a031614156118fb57600e546040805160e060020a63e05c5a83028152600481018590529051600160a060020a039092169163e05c5a83916024808201926020929091908290030181600087803b1580156118c857600080fd5b505af11580156118dc573d6000803e3d6000fd5b505050506040513d60208110156118f257600080fd5b50519050610dae565b600f54600160a060020a031661191083611d71565b600160a060020a0316141561197057600f546040805160e060020a63e05c5a83028152600481018590529051600160a060020a039092169163e05c5a83916024808201926020929091908290030181600087803b1580156118c857600080fd5b600d54600160a060020a031661198583611d71565b600160a060020a031614156119a65750600154600160a060020a0316610dae565b6119af82611d71565b9050610dae565b600454600160a060020a031681565b6000806119d1856132b5565b15156119dc57600080fd5b60078054869081106119ea57fe5b60009182526020822060049190910201600381015490935062010000900461ffff1611611a1657600080fd5b611a4f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437506131dd945050505050565b6002830181905560408051600160a060020a03331681526020810188905280820183905290519192507f12816a0444091c736dc43fb9055af6aae4dced18627ba52aa7708eecff824005919081900360600190a15050505050565b60015433600160a060020a03908116911614611ac557600080fd5b60035460a060020a900460ff161515611add57600080fd5b6003805474ff000000000000000000000000000000000000000019169055565b600e54600160a060020a031681565b60015433600160a060020a03908116911614611b2757600080fd5b600160a060020a0381161515611b3c57600080fd5b60048054600160a060020a031916600160a060020a0392909216919091179055565b600f54600160a060020a031681565b60015433600160a060020a03908116911614611b8857600080fd5b600160a060020a0381161515611b9d57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b6000600783815481101515611bd057fe5b90600052602060002090600402019050428160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151515611c1157600080fd5b600e54611c2790600160a060020a0316846111a9565b600e54604080517f2e3cbb3b000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152602482018790526044820186905291519190921691632e3cbb3b91606480830192600092919082900301818387803b158015611c9c57600080fd5b505af1158015611cb0573d6000803e3d6000fd5b505060408051600160a060020a03331681526020810187905280820186905290517fbaba636376a020113de783bc39a253b720f825712c73bca7bc823142ea391d8b9350908190036060019150a1505050565b60035460a060020a900460ff1681565b600160a060020a033316600081815260208190526040808220805490839055905190929183156108fc02918491818181858888f193505050501515611d6e57600160a060020a03331660009081526020819052604090208190555b50565b600081815260086020526040902054600160a060020a0316801515610dae57600080fd5b600860205260009081526040902054600160a060020a031681565b600454606090600160a060020a03161515611dca57600080fd5b60008210158015611ddd57506007548211155b1515611de857600080fd5b60048054604080517f2f7b367700000000000000000000000000000000000000000000000000000000815292830185905251600160a060020a0390911691632f7b367791602480830192600092919082900301818387803b158015611e4c57600080fd5b505af1158015611e60573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611e8957600080fd5b810190808051640100000000811115611ea157600080fd5b82016020810184811115611eb457600080fd5b8151640100000000811182820187101715611ece57600080fd5b50909695505050505050565b600160a060020a031660009081526009602052604090205490565b600f54600160a060020a031690565b60015460009033600160a060020a03908116911614611f2257600080fd5b81905080600160a060020a0316633eebc5896040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f6357600080fd5b505af1158015611f77573d6000803e3d6000fd5b505050506040513d6020811015611f8d57600080fd5b50511515611f9a57600080fd5b600e8054600160a060020a031916600160a060020a039290921691909117905550565b60035433600160a060020a0390811691161480611fe8575060015433600160a060020a039081169116145b80612001575060025433600160a060020a039081169116145b151561200c57600080fd5b60035460a060020a900460ff161561202357600080fd5b6003805474ff0000000000000000000000000000000000000000191660a060020a179055565b606060006060600080600061205d87611eda565b945084151561207c576040805160008152602081019091529550612111565b846040519080825280602002602001820160405280156120a6578160200160208202803883390190505b5093506120b161135e565b925060009150600190505b82811161210d57600081815260086020526040902054600160a060020a0388811691161415612105578084838151811015156120f457fe5b602090810290910101526001909101905b6001016120bc565b8395505b5050505050919050565b6000612126826132b5565b151561213157600080fd5b600c5434101561214057600080fd5b600780548390811061214e57fe5b6000918252602091829020600160049092020190810180546fffffffffffffffff0000000000000000191668010000000000000000179055600c5460408051868152600160a060020a0333169481019490945283810191909152519092507f9d8c702c4edf3197c01314ac15165f0bd401460586b7bb489d4adeafd1ce48cd9181900360600190a15050565b60408051808201909152600381527f504f500000000000000000000000000000000000000000000000000000000000602082015281565b6000806000806000806000600360149054906101000a900460ff1615151561223857600080fd5b6000891161224557600080fd5b6000881161225257600080fd5b61225b896133f7565b151561226657600080fd5b61226f886133f7565b151561227a57600080fd5b600780548a90811061228857fe5b906000526020600020906004020195506007888154811015156122a757fe5b600091825260209091206004909102018054875491965014156122c957600080fd5b6001860154426801000000000000000090910467ffffffffffffffff1611156122f157600080fd5b6001850154426801000000000000000090910467ffffffffffffffff16111561231957600080fd5b6003808701549086015461ffff6201000092839004811696509190041684101561234f57600385015462010000900461ffff1693505b836001019250600d8361ffff16111561236757600d92505b60105486548654604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a0390921691638d8b1b88916044808201926020929091908290030181600087803b1580156123da57600080fd5b505af11580156123ee573d6000803e3d6000fd5b505050506040513d602081101561240457600080fd5b505191506124118661346e565b61241a8561346e565b60016007610100604051908101604052808581526020014267ffffffffffffffff168152602001600167ffffffffffffffff1681526020018c63ffffffff1681526020018b63ffffffff16815260200160006001026000191681526020018661ffff1681526020018760010161ffff16815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a0820151816002019060001916905560c08201518160030160006101000a81548161ffff021916908361ffff16021790555060e08201518160030160026101000a81548161ffff021916908361ffff1602179055505050039050336008600083815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a031602179055506009600033600160a060020a0316600160a060020a03168152602001908152602001600020546001016009600033600160a060020a0316600160a060020a03168152602001908152602001600020819055507f3f6242f41be9e68b16f202159c05c0763a0092812f68b90f1fd4db6fc21276b733828b8b6040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a160408051600160a060020a0333168152602081018390528082018b9052606081018a90526080810184905290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a198975050505050505050565b60035460009033600160a060020a0390811691161480612745575060015433600160a060020a039081169116145b8061275e575060025433600160a060020a039081169116145b151561276957600080fd5b6127733384613201565b151561277e57600080fd5b600780548490811061278c57fe5b60009182526020909120600490910201919091555050565b600581600e81106127b157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600a60205260009081526040902054600160a060020a031681565b60035460a060020a900460ff161561280357600080fd5b61280d3382613201565b151561281857600080fd5b61282182613241565b151561282c57600080fd5b612836828261324f565b60408051600160a060020a0333811682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a15050565b60008061288f6134d5565b60035460009081908190819060a060020a900460ff16156128af57600080fd5b600089116128bc57600080fd5b6128c5896133f7565b15156128d057600080fd5b600780548a9081106128de57fe5b906000526020600020906004020195506007888154811015156128fd57fe5b6000918252602091829020604080516101008101825260049093029091018054808452600182015467ffffffffffffffff808216968601969096526801000000000000000081049095169284019290925263ffffffff70010000000000000000000000000000000085048116606085015260a060020a9094049093166080830152600283015460a083015260039092015461ffff80821660c0840152620100009091041660e0820152875490965014156129b657600080fd5b6001860154426801000000000000000090910467ffffffffffffffff1611156129de57600080fd5b600386015460e086015161ffff620100009092048216955016841015612a06578460e0015193505b836001019250600d8361ffff161115612a1e57600d92505b600f54604080517f61b9c6a3000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152602482018c9052915191909216916361b9c6a391604480830192600092919082900301818387803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b505060105488548851604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a039092169350638d8b1b8892506044808201926020929091908290030181600087803b158015612b1757600080fd5b505af1158015612b2b573d6000803e3d6000fd5b505050506040513d6020811015612b4157600080fd5b50519150612b4e8661346e565b60016007610100604051908101604052808581526020014267ffffffffffffffff168152602001600167ffffffffffffffff1681526020018c63ffffffff1681526020018b63ffffffff16815260200160006001026000191681526020018661ffff1681526020018760010161ffff16815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a0820151816002019060001916905560c08201518160030160006101000a81548161ffff021916908361ffff16021790555060e08201518160030160026101000a81548161ffff021916908361ffff1602179055505050039050336008600083815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a031602179055506009600033600160a060020a0316600160a060020a03168152602001908152602001600020546001016009600033600160a060020a0316600160a060020a03168152602001908152602001600020819055507f730e62690575eb5131bd693bc715b6d16db550a3e496a9635c158817e644c37f33828b8b6040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a160408051600160a060020a0333168152602081018390528082018b9052606081018a90526080810184905290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a198975050505050505050565b600d54600160a060020a031681565b600354600160a060020a031681565b600c5481565b600080612e7b83611d71565b9150339050612e8981613241565b1515612e9457600080fd5b612e9e8184613221565b1515612ea957600080fd5b612eb3818461324f565b60408051600160a060020a0380851682528316602082015280820185905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b60035433600160a060020a0390811691161480612f2d575060015433600160a060020a039081169116145b80612f46575060025433600160a060020a039081169116145b1515612f5157600080fd5b600c55565b60015460009033600160a060020a03908116911614612f7457600080fd5b81905080600160a060020a03166309c38bc86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612fb557600080fd5b505af1158015612fc9573d6000803e3d6000fd5b505050506040513d6020811015612fdf57600080fd5b50511515612fec57600080fd5b600d8054600160a060020a031916600160a060020a039290921691909117905550565b60096020526000908152604090205481565b60006020819052908152604090205481565b600780548290811061304157fe5b6000918252602090912060049091020180546001820154600283015460039093015491935067ffffffffffffffff808216936801000000000000000083049091169263ffffffff700100000000000000000000000000000000840481169360a060020a900416919061ffff808216916201000090041688565b60035433600160a060020a03908116911614806130e5575060015433600160a060020a039081169116145b806130fe575060025433600160a060020a039081169116145b151561310957600080fd5b600d5461311f90600160a060020a0316836111a9565b600d54604080517f54279bdd0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052600160a060020a033381166044830152915191909216916354279bdd91606480830192600092919082900301818387803b15801561319457600080fd5b505af11580156131a8573d6000803e3d6000fd5b505050505050565b600d54600160a060020a031690565b601054600160a060020a031690565b601054600160a060020a031681565b8051600090829015156131f357600091506131fb565b602083015191505b50919050565b600090815260086020526040902054600160a060020a0390811691161490565b6000908152600a6020526040902054600160a060020a0391821691161490565b600160a060020a0316151590565b60008181526008602090815260408083208054600160a060020a03908116855260098085528386208054600019019055958552600a84528285208054600160a060020a031990811690915582541696169586179055938252919091522080546001019055565b600033600160a060020a03166132ca83611d71565b600160a060020a031614806133635750600f546040805160e060020a63e05c5a83028152600481018590529051600160a060020a0333811693169163e05c5a839160248083019260209291908290030181600087803b15801561332c57600080fd5b505af1158015613340573d6000803e3d6000fd5b505050506040513d602081101561335657600080fd5b5051600160a060020a0316145b80610dab5750600e546040805160e060020a63e05c5a83028152600481018590529051600160a060020a0333811693169163e05c5a839160248083019260209291908290030181600087803b1580156133bb57600080fd5b505af11580156133cf573d6000803e3d6000fd5b505050506040513d60208110156133e557600080fd5b5051600160a060020a03161492915050565b600033600160a060020a031661340c83611d71565b600160a060020a03161480610dab5750600f546040805160e060020a63e05c5a83028152600481018590529051600160a060020a0333811693169163e05c5a839160248083019260209291908290030181600087803b1580156133bb57600080fd5b600381015460059061ffff16600e811061348457fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1642018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152905600a165627a7a723058203e4e0de87e725e99863b20fd137393b3a06ac774415c60ee3f2bfd778c13857e0029

Deployed Bytecode

0x6080604052600436106102b05763ffffffff60e060020a60003504166301b0c6e081146102b557806301ffc9a7146102df5780630479fcd01461032a5780630519ce791461035057806306fdde03146103815780630762c3171461040b578063095ea7b31461046957806309b70ad01461048d5780630a0f8168146104a85780631051db34146104bd57806312065fe0146104d257806318160ddd146104e757806319b466fa146104fc5780631d862a811461051d57806323b872dd14610596578063242db433146105c057806324e7a38a146105d557806327d7874c146105f65780632ba73c15146106175780632e1a7d4d1461063857806332be9502146106505780633520982114610668578063386e0d751461067d5780633f4ba83a146106a157806341ed2c12146106b65780634d74d3b4146106cb5780634ddad616146106ec5780634e0a3379146107015780635422cf34146107225780635c975abb1461073d5780636103d70b146107525780636352211e14610767578063672498541461077f5780636914db601461079757806370a08231146107af5780637d236928146107d0578063822f005a146107e55780638456cb59146108065780638462151c1461081b5780638a6508ce1461088c57806395d89b4114610897578063966588d4146108ac578063983a7f47146108c75780639d6fac6f146108e25780639eeab9c714610913578063a9059cbb1461092b578063aa056d2a1461094f578063b0192f9a1461096a578063b047fb501461097f578063b07741fd14610994578063b2e6ceeb146109a9578063c0f4f41e146109c1578063cd7dc52d146109d9578063cec21acb146109fa578063e2982c2114610a1b578063eb28a51514610a3c578063ee7e203914610ab2578063ef98dea314610acd578063f129c5d714610ae2578063f2b47d5214610af7575b600080fd5b3480156102c157600080fd5b506102cd600435610b0c565b60408051918252519081900360200190f35b3480156102eb57600080fd5b506103167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610b1e565b604080519115158252519081900360200190f35b34801561033657600080fd5b5061034e600480359060248035908101910135610db3565b005b34801561035c57600080fd5b50610365610e89565b60408051600160a060020a039092168252519081900360200190f35b34801561038d57600080fd5b50610396610e98565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d05781810151838201526020016103b8565b50505050905090810190601f1680156103fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041757600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261034e958335953695604494919390910191908190840183828082843750949750610ecf9650505050505050565b34801561047557600080fd5b5061034e600160a060020a03600435166024356111a9565b34801561049957600080fd5b5061034e60043560243561123e565b3480156104b457600080fd5b5061036561133c565b3480156104c957600080fd5b5061031661134b565b3480156104de57600080fd5b506102cd611350565b3480156104f357600080fd5b506102cd61135e565b34801561050857600080fd5b5061034e600160a060020a0360043516611364565b34801561052957600080fd5b5061053560043561141d565b604080519915158a5260208a019890985267ffffffffffffffff9687168989015294909516606088015263ffffffff9283166080880152911660a086015260c085015261ffff91821660e08501521661010083015251908190036101200190f35b3480156105a257600080fd5b5061034e600160a060020a03600435811690602435166044356115c7565b3480156105cc57600080fd5b50610365611675565b3480156105e157600080fd5b5061034e600160a060020a0360043516611684565b34801561060257600080fd5b5061034e600160a060020a036004351661173d565b34801561062357600080fd5b5061034e600160a060020a036004351661178f565b34801561064457600080fd5b5061034e6004356117e1565b34801561065c57600080fd5b50610365600435611850565b34801561067457600080fd5b506103656119b6565b34801561068957600080fd5b5061034e6004803590602480359081019101356119c5565b3480156106ad57600080fd5b5061034e611aaa565b3480156106c257600080fd5b50610365611afd565b3480156106d757600080fd5b5061034e600160a060020a0360043516611b0c565b3480156106f857600080fd5b50610365611b5e565b34801561070d57600080fd5b5061034e600160a060020a0360043516611b6d565b34801561072e57600080fd5b5061034e600435602435611bbf565b34801561074957600080fd5b50610316611d03565b34801561075e57600080fd5b5061034e611d13565b34801561077357600080fd5b50610365600435611d71565b34801561078b57600080fd5b50610365600435611d95565b3480156107a357600080fd5b50610396600435611db0565b3480156107bb57600080fd5b506102cd600160a060020a0360043516611eda565b3480156107dc57600080fd5b50610365611ef5565b3480156107f157600080fd5b5061034e600160a060020a0360043516611f04565b34801561081257600080fd5b5061034e611fbd565b34801561082757600080fd5b5061083c600160a060020a0360043516612049565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610878578181015183820152602001610860565b505050509050019250505060405180910390f35b61034e60043561211b565b3480156108a357600080fd5b506103966121da565b3480156108b857600080fd5b506102cd600435602435612211565b3480156108d357600080fd5b5061034e600435602435612717565b3480156108ee57600080fd5b506108fa6004356127a4565b6040805163ffffffff9092168252519081900360200190f35b34801561091f57600080fd5b506103656004356127d1565b34801561093757600080fd5b5061034e600160a060020a03600435166024356127ec565b34801561095b57600080fd5b506102cd600435602435612884565b34801561097657600080fd5b50610365612e4b565b34801561098b57600080fd5b50610365612e5a565b3480156109a057600080fd5b506102cd612e69565b3480156109b557600080fd5b5061034e600435612e6f565b3480156109cd57600080fd5b5061034e600435612f02565b3480156109e557600080fd5b5061034e600160a060020a0360043516612f56565b348015610a0657600080fd5b506102cd600160a060020a036004351661300f565b348015610a2757600080fd5b506102cd600160a060020a0360043516613021565b348015610a4857600080fd5b50610a54600435613033565b6040805198895267ffffffffffffffff97881660208a0152959096168786015263ffffffff938416606088015291909216608086015260a085019190915261ffff90811660c08501529190911660e083015251908190036101000190f35b348015610abe57600080fd5b5061034e6004356024356130ba565b348015610ad957600080fd5b506103656131b0565b348015610aee57600080fd5b506103656131bf565b348015610b0357600080fd5b506103656131ce565b600b6020526000908152604090205481565b604080517f737570706f727473496e74657266616365286279746573342900000000000000815290519081900360190190206000907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1983811691161480610dab5750604080517f746f6b656e4d657461646174612875696e7432353629000000000000000000008152815190819003601690810182207f746f6b656e734f664f776e657228616464726573732900000000000000000000835283519283900390910182207f7472616e7366657246726f6d28616464726573732c616464726573732c75696e83527f7432353629000000000000000000000000000000000000000000000000000000602084015283519283900360250183207f7472616e7366657228616464726573732c75696e743235362900000000000000845284519384900360190184207f617070726f766528616464726573732c75696e74323536290000000000000000855285519485900360180185207f6f776e65724f662875696e743235362900000000000000000000000000000000865286519586900360100186207f62616c616e63654f662861646472657373290000000000000000000000000000875287519687900360120187207f746f74616c537570706c792829000000000000000000000000000000000000008852885197889003600d0188207f73796d626f6c2829000000000000000000000000000000000000000000000000895289519889900360080189207f6e616d65282900000000000000000000000000000000000000000000000000008a529951988990036006019098207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198c811691909a189098181818181818181891909116145b90505b919050565b600354600090819033600160a060020a0390811691161480610de3575060015433600160a060020a039081169116145b80610dfc575060025433600160a060020a039081169116145b1515610e0757600080fd5b6007805486908110610e1557fe5b60009182526020909120600490910201600381015490925062010000900461ffff1615610e4157600080fd5b610e7a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437506131dd945050505050565b60029092019190915550505050565b600254600160a060020a031681565b60408051808201909152600b81527f5245504f5020574f524c44000000000000000000000000000000000000000000602082015281565b600354600090819033600160a060020a0390811691161480610eff575060015433600160a060020a039081169116145b80610f18575060025433600160a060020a039081169116145b1515610f2357600080fd5b60035460a060020a900460ff1615610f3a57600080fd5b610f43836131dd565b915060016007610100604051908101604052808781526020014267ffffffffffffffff168152602001600167ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff16815260200185600019168152602001600061ffff168152602001600061ffff16815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a0820151816002019060001916905560c08201518160030160006101000a81548161ffff021916908361ffff16021790555060e08201518160030160026101000a81548161ffff021916908361ffff16021790555050500390507f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad53382600080886040518086600160a060020a0316600160a060020a031681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16000938452600b60209081526040808620839055918552600881528185208054600160a060020a03191633600160a060020a0316908117909155855260099052909220805460010190555050565b60035460a060020a900460ff16156111c057600080fd5b6111ca3382613201565b15156111d557600080fd5b6000818152600a60209081526040918290208054600160a060020a031916600160a060020a0386811691821790925583518581529351909333909216927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35050565b6000821161124b57600080fd5b600f5461126190600160a060020a0316836111a9565b600f54604080517f7c37605c0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052600160a060020a03338116604483015291519190921691637c37605c91606480830192600092919082900301818387803b1580156112d657600080fd5b505af11580156112ea573d6000803e3d6000fd5b505060408051600160a060020a03331681526020810186905280820185905290517f2acb6fff53b285dad2e80f11ca04ecc39506a3f0da4962f82a57bf06cf9c0c1c9350908190036060019150a15050565b600154600160a060020a031681565b600190565b600160a060020a0330163190565b60075490565b60015460009033600160a060020a0390811691161461138257600080fd5b81905080600160a060020a03166373a699ad6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156113c357600080fd5b505af11580156113d7573d6000803e3d6000fd5b505050506040513d60208110156113ed57600080fd5b505115156113fa57600080fd5b600f8054600160a060020a031916600160a060020a039290921691909117905550565b60008060008060008060008060006114336134d5565b600780548c90811061144157fe5b90600052602060002090600402016101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016002820154600019166000191681526020016003820160009054906101000a900461ffff1661ffff1661ffff1681526020016003820160029054906101000a900461ffff1661ffff1661ffff1681525050905042816040015167ffffffffffffffff161115995089816000015182602001518360400151846060015185608001518660a001518760c001518860e00151995099509950995099509950995099509950509193959799909294969850565b60035460a060020a900460ff16156115de57600080fd5b6115e88382613201565b15156115f357600080fd5b6115fd3382613221565b151561160857600080fd5b61161182613241565b151561161c57600080fd5b611626828261324f565b60408051600160a060020a0380861682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b600e54600160a060020a031690565b60015460009033600160a060020a039081169116146116a257600080fd5b81905080600160a060020a03166354c15b826040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156116e357600080fd5b505af11580156116f7573d6000803e3d6000fd5b505050506040513d602081101561170d57600080fd5b5051151561171a57600080fd5b60108054600160a060020a031916600160a060020a039290921691909117905550565b60015433600160a060020a0390811691161461175857600080fd5b600160a060020a038116151561176d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146117aa57600080fd5b600160a060020a03811615156117bf57600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b60025433600160a060020a039081169116146117fc57600080fd5b600160a060020a03301631811061181257600080fd5b600254604051600160a060020a039091169082156108fc029083906000818181858888f1935050505015801561184c573d6000803e3d6000fd5b5050565b600e54600090600160a060020a031661186883611d71565b600160a060020a031614156118fb57600e546040805160e060020a63e05c5a83028152600481018590529051600160a060020a039092169163e05c5a83916024808201926020929091908290030181600087803b1580156118c857600080fd5b505af11580156118dc573d6000803e3d6000fd5b505050506040513d60208110156118f257600080fd5b50519050610dae565b600f54600160a060020a031661191083611d71565b600160a060020a0316141561197057600f546040805160e060020a63e05c5a83028152600481018590529051600160a060020a039092169163e05c5a83916024808201926020929091908290030181600087803b1580156118c857600080fd5b600d54600160a060020a031661198583611d71565b600160a060020a031614156119a65750600154600160a060020a0316610dae565b6119af82611d71565b9050610dae565b600454600160a060020a031681565b6000806119d1856132b5565b15156119dc57600080fd5b60078054869081106119ea57fe5b60009182526020822060049190910201600381015490935062010000900461ffff1611611a1657600080fd5b611a4f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437506131dd945050505050565b6002830181905560408051600160a060020a03331681526020810188905280820183905290519192507f12816a0444091c736dc43fb9055af6aae4dced18627ba52aa7708eecff824005919081900360600190a15050505050565b60015433600160a060020a03908116911614611ac557600080fd5b60035460a060020a900460ff161515611add57600080fd5b6003805474ff000000000000000000000000000000000000000019169055565b600e54600160a060020a031681565b60015433600160a060020a03908116911614611b2757600080fd5b600160a060020a0381161515611b3c57600080fd5b60048054600160a060020a031916600160a060020a0392909216919091179055565b600f54600160a060020a031681565b60015433600160a060020a03908116911614611b8857600080fd5b600160a060020a0381161515611b9d57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b6000600783815481101515611bd057fe5b90600052602060002090600402019050428160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1611151515611c1157600080fd5b600e54611c2790600160a060020a0316846111a9565b600e54604080517f2e3cbb3b000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152602482018790526044820186905291519190921691632e3cbb3b91606480830192600092919082900301818387803b158015611c9c57600080fd5b505af1158015611cb0573d6000803e3d6000fd5b505060408051600160a060020a03331681526020810187905280820186905290517fbaba636376a020113de783bc39a253b720f825712c73bca7bc823142ea391d8b9350908190036060019150a1505050565b60035460a060020a900460ff1681565b600160a060020a033316600081815260208190526040808220805490839055905190929183156108fc02918491818181858888f193505050501515611d6e57600160a060020a03331660009081526020819052604090208190555b50565b600081815260086020526040902054600160a060020a0316801515610dae57600080fd5b600860205260009081526040902054600160a060020a031681565b600454606090600160a060020a03161515611dca57600080fd5b60008210158015611ddd57506007548211155b1515611de857600080fd5b60048054604080517f2f7b367700000000000000000000000000000000000000000000000000000000815292830185905251600160a060020a0390911691632f7b367791602480830192600092919082900301818387803b158015611e4c57600080fd5b505af1158015611e60573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611e8957600080fd5b810190808051640100000000811115611ea157600080fd5b82016020810184811115611eb457600080fd5b8151640100000000811182820187101715611ece57600080fd5b50909695505050505050565b600160a060020a031660009081526009602052604090205490565b600f54600160a060020a031690565b60015460009033600160a060020a03908116911614611f2257600080fd5b81905080600160a060020a0316633eebc5896040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f6357600080fd5b505af1158015611f77573d6000803e3d6000fd5b505050506040513d6020811015611f8d57600080fd5b50511515611f9a57600080fd5b600e8054600160a060020a031916600160a060020a039290921691909117905550565b60035433600160a060020a0390811691161480611fe8575060015433600160a060020a039081169116145b80612001575060025433600160a060020a039081169116145b151561200c57600080fd5b60035460a060020a900460ff161561202357600080fd5b6003805474ff0000000000000000000000000000000000000000191660a060020a179055565b606060006060600080600061205d87611eda565b945084151561207c576040805160008152602081019091529550612111565b846040519080825280602002602001820160405280156120a6578160200160208202803883390190505b5093506120b161135e565b925060009150600190505b82811161210d57600081815260086020526040902054600160a060020a0388811691161415612105578084838151811015156120f457fe5b602090810290910101526001909101905b6001016120bc565b8395505b5050505050919050565b6000612126826132b5565b151561213157600080fd5b600c5434101561214057600080fd5b600780548390811061214e57fe5b6000918252602091829020600160049092020190810180546fffffffffffffffff0000000000000000191668010000000000000000179055600c5460408051868152600160a060020a0333169481019490945283810191909152519092507f9d8c702c4edf3197c01314ac15165f0bd401460586b7bb489d4adeafd1ce48cd9181900360600190a15050565b60408051808201909152600381527f504f500000000000000000000000000000000000000000000000000000000000602082015281565b6000806000806000806000600360149054906101000a900460ff1615151561223857600080fd5b6000891161224557600080fd5b6000881161225257600080fd5b61225b896133f7565b151561226657600080fd5b61226f886133f7565b151561227a57600080fd5b600780548a90811061228857fe5b906000526020600020906004020195506007888154811015156122a757fe5b600091825260209091206004909102018054875491965014156122c957600080fd5b6001860154426801000000000000000090910467ffffffffffffffff1611156122f157600080fd5b6001850154426801000000000000000090910467ffffffffffffffff16111561231957600080fd5b6003808701549086015461ffff6201000092839004811696509190041684101561234f57600385015462010000900461ffff1693505b836001019250600d8361ffff16111561236757600d92505b60105486548654604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a0390921691638d8b1b88916044808201926020929091908290030181600087803b1580156123da57600080fd5b505af11580156123ee573d6000803e3d6000fd5b505050506040513d602081101561240457600080fd5b505191506124118661346e565b61241a8561346e565b60016007610100604051908101604052808581526020014267ffffffffffffffff168152602001600167ffffffffffffffff1681526020018c63ffffffff1681526020018b63ffffffff16815260200160006001026000191681526020018661ffff1681526020018760010161ffff16815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a0820151816002019060001916905560c08201518160030160006101000a81548161ffff021916908361ffff16021790555060e08201518160030160026101000a81548161ffff021916908361ffff1602179055505050039050336008600083815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a031602179055506009600033600160a060020a0316600160a060020a03168152602001908152602001600020546001016009600033600160a060020a0316600160a060020a03168152602001908152602001600020819055507f3f6242f41be9e68b16f202159c05c0763a0092812f68b90f1fd4db6fc21276b733828b8b6040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a160408051600160a060020a0333168152602081018390528082018b9052606081018a90526080810184905290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a198975050505050505050565b60035460009033600160a060020a0390811691161480612745575060015433600160a060020a039081169116145b8061275e575060025433600160a060020a039081169116145b151561276957600080fd5b6127733384613201565b151561277e57600080fd5b600780548490811061278c57fe5b60009182526020909120600490910201919091555050565b600581600e81106127b157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b600a60205260009081526040902054600160a060020a031681565b60035460a060020a900460ff161561280357600080fd5b61280d3382613201565b151561281857600080fd5b61282182613241565b151561282c57600080fd5b612836828261324f565b60408051600160a060020a0333811682528416602082015280820183905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a15050565b60008061288f6134d5565b60035460009081908190819060a060020a900460ff16156128af57600080fd5b600089116128bc57600080fd5b6128c5896133f7565b15156128d057600080fd5b600780548a9081106128de57fe5b906000526020600020906004020195506007888154811015156128fd57fe5b6000918252602091829020604080516101008101825260049093029091018054808452600182015467ffffffffffffffff808216968601969096526801000000000000000081049095169284019290925263ffffffff70010000000000000000000000000000000085048116606085015260a060020a9094049093166080830152600283015460a083015260039092015461ffff80821660c0840152620100009091041660e0820152875490965014156129b657600080fd5b6001860154426801000000000000000090910467ffffffffffffffff1611156129de57600080fd5b600386015460e086015161ffff620100009092048216955016841015612a06578460e0015193505b836001019250600d8361ffff161115612a1e57600d92505b600f54604080517f61b9c6a3000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152602482018c9052915191909216916361b9c6a391604480830192600092919082900301818387803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b505060105488548851604080517f8d8b1b880000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a039092169350638d8b1b8892506044808201926020929091908290030181600087803b158015612b1757600080fd5b505af1158015612b2b573d6000803e3d6000fd5b505050506040513d6020811015612b4157600080fd5b50519150612b4e8661346e565b60016007610100604051908101604052808581526020014267ffffffffffffffff168152602001600167ffffffffffffffff1681526020018c63ffffffff1681526020018b63ffffffff16815260200160006001026000191681526020018661ffff1681526020018760010161ffff16815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a0820151816002019060001916905560c08201518160030160006101000a81548161ffff021916908361ffff16021790555060e08201518160030160026101000a81548161ffff021916908361ffff1602179055505050039050336008600083815260200190815260200160002060006101000a815481600160a060020a030219169083600160a060020a031602179055506009600033600160a060020a0316600160a060020a03168152602001908152602001600020546001016009600033600160a060020a0316600160a060020a03168152602001908152602001600020819055507f730e62690575eb5131bd693bc715b6d16db550a3e496a9635c158817e644c37f33828b8b6040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390a160408051600160a060020a0333168152602081018390528082018b9052606081018a90526080810184905290517f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad59181900360a00190a198975050505050505050565b600d54600160a060020a031681565b600354600160a060020a031681565b600c5481565b600080612e7b83611d71565b9150339050612e8981613241565b1515612e9457600080fd5b612e9e8184613221565b1515612ea957600080fd5b612eb3818461324f565b60408051600160a060020a0380851682528316602082015280820185905290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360600190a1505050565b60035433600160a060020a0390811691161480612f2d575060015433600160a060020a039081169116145b80612f46575060025433600160a060020a039081169116145b1515612f5157600080fd5b600c55565b60015460009033600160a060020a03908116911614612f7457600080fd5b81905080600160a060020a03166309c38bc86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612fb557600080fd5b505af1158015612fc9573d6000803e3d6000fd5b505050506040513d6020811015612fdf57600080fd5b50511515612fec57600080fd5b600d8054600160a060020a031916600160a060020a039290921691909117905550565b60096020526000908152604090205481565b60006020819052908152604090205481565b600780548290811061304157fe5b6000918252602090912060049091020180546001820154600283015460039093015491935067ffffffffffffffff808216936801000000000000000083049091169263ffffffff700100000000000000000000000000000000840481169360a060020a900416919061ffff808216916201000090041688565b60035433600160a060020a03908116911614806130e5575060015433600160a060020a039081169116145b806130fe575060025433600160a060020a039081169116145b151561310957600080fd5b600d5461311f90600160a060020a0316836111a9565b600d54604080517f54279bdd0000000000000000000000000000000000000000000000000000000081526004810185905260248101849052600160a060020a033381166044830152915191909216916354279bdd91606480830192600092919082900301818387803b15801561319457600080fd5b505af11580156131a8573d6000803e3d6000fd5b505050505050565b600d54600160a060020a031690565b601054600160a060020a031690565b601054600160a060020a031681565b8051600090829015156131f357600091506131fb565b602083015191505b50919050565b600090815260086020526040902054600160a060020a0390811691161490565b6000908152600a6020526040902054600160a060020a0391821691161490565b600160a060020a0316151590565b60008181526008602090815260408083208054600160a060020a03908116855260098085528386208054600019019055958552600a84528285208054600160a060020a031990811690915582541696169586179055938252919091522080546001019055565b600033600160a060020a03166132ca83611d71565b600160a060020a031614806133635750600f546040805160e060020a63e05c5a83028152600481018590529051600160a060020a0333811693169163e05c5a839160248083019260209291908290030181600087803b15801561332c57600080fd5b505af1158015613340573d6000803e3d6000fd5b505050506040513d602081101561335657600080fd5b5051600160a060020a0316145b80610dab5750600e546040805160e060020a63e05c5a83028152600481018590529051600160a060020a0333811693169163e05c5a839160248083019260209291908290030181600087803b1580156133bb57600080fd5b505af11580156133cf573d6000803e3d6000fd5b505050506040513d60208110156133e557600080fd5b5051600160a060020a03161492915050565b600033600160a060020a031661340c83611d71565b600160a060020a03161480610dab5750600f546040805160e060020a63e05c5a83028152600481018590529051600160a060020a0333811693169163e05c5a839160248083019260209291908290030181600087803b1580156133bb57600080fd5b600381015460059061ffff16600e811061348457fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1642018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152905600a165627a7a723058203e4e0de87e725e99863b20fd137393b3a06ac774415c60ee3f2bfd778c13857e0029

Swarm Source

bzzr://3e4e0de87e725e99863b20fd137393b3a06ac774415c60ee3f2bfd778c13857e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.