ETH Price: $2,682.33 (+1.71%)

Token

REPOP WORLD (POP)
 

Overview

Max Total Supply

91 POP

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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

[{"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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.