ETH Price: $1,851.13 (+1.16%)
Gas: 18 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multi Chain

Multichain Addresses

0 address found via
Transaction Hash
Method
Block
From
To
Value
Set Presale Mode61817612018-08-20 14:07:211753 days 8 hrs ago1534774041IN
0x168085...8EF65BD2
0 ETH0.000084433
Set Presale61817402018-08-20 14:01:431753 days 8 hrs ago1534773703IN
0x168085...8EF65BD2
0 ETH0.000088673
Set Presale61816662018-08-20 13:44:021753 days 9 hrs ago1534772642IN
0x168085...8EF65BD2
0 ETH0.000133673
Minion Add61815732018-08-20 13:19:281753 days 9 hrs ago1534771168IN
0x168085...8EF65BD2
0 ETH0.000132682
Minion Add61815582018-08-20 13:17:021753 days 9 hrs ago1534771022IN
0x168085...8EF65BD2
0 ETH0.000132682
Minion Add61815382018-08-20 13:12:121753 days 9 hrs ago1534770732IN
0x168085...8EF65BD2
0 ETH0.000132682
Minion Add61815382018-08-20 13:12:121753 days 9 hrs ago1534770732IN
0x168085...8EF65BD2
0 ETH0.000139312.1
0x6080604061814972018-08-20 13:02:161753 days 9 hrs ago1534770136IN
 Create: EtherDragonsCore
0 ETH0.007995942

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EtherDragonsCore

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-08-28
*/

pragma solidity ^0.4.11;

interface CommonWallet {
    function receive() external payable;
}

library StringUtils {
    function concat(string _a, string _b)
        internal
        pure
        returns (string)
    {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);

        bytes memory bab = new bytes(_ba.length + _bb.length);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) bab[k++] = _bb[i];
        return string(bab);
    }
}

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

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

 // @title SafeMath256
 // @dev Math operations with safety checks that throw on error
library SafeMath256 {

  // @dev Multiplies two numbers, throws on overflow.
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  // @dev Integer division of two numbers, truncating the quotient.
  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 a / b;
  }


  // @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }


  // @dev Adds two numbers, throws on overflow.
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

library SafeMath32 {
  // @dev Multiplies two numbers, throws on overflow.
  function mul(uint32 a, uint32 b) internal pure returns (uint32 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }


  // @dev Integer division of two numbers, truncating the quotient.
  function div(uint32 a, uint32 b) internal pure returns (uint32) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint32 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }


  // @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  function sub(uint32 a, uint32 b) internal pure returns (uint32) {
    assert(b <= a);
    return a - b;
  }


  // @dev Adds two numbers, throws on overflow.
  function add(uint32 a, uint32 b) internal pure returns (uint32 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

library SafeMath8 {
  // @dev Multiplies two numbers, throws on overflow.
  function mul(uint8 a, uint8 b) internal pure returns (uint8 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }


  // @dev Integer division of two numbers, truncating the quotient.
  function div(uint8 a, uint8 b) internal pure returns (uint8) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint8 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }


  // @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  function sub(uint8 a, uint8 b) internal pure returns (uint8) {
    assert(b <= a);
    return a - b;
  }


  // @dev Adds two numbers, throws on overflow.
  function add(uint8 a, uint8 b) internal pure returns (uint8 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

/// @title A facet of DragonCore that manages special access privileges.
contract DragonAccessControl 
{
    // @dev Non Assigned address.
    address constant NA = address(0);

    /// @dev Contract owner
    address internal controller_;

    /// @dev Contract modes
    enum Mode {TEST, PRESALE, OPERATE}

    /// @dev Contract state
    Mode internal mode_ = Mode.TEST;

    /// @dev OffChain Server accounts ('minions') addresses
    /// It's used for money withdrawal and export of tokens 
    mapping(address => bool) internal minions_;
    
    /// @dev Presale contract address. Can call `presale` method.
    address internal presale_;

    // Modifiers ---------------------------------------------------------------
    /// @dev Limit execution to controller account only.
    modifier controllerOnly() {
        require(controller_ == msg.sender, "controller_only");
        _;
    }

    /// @dev Limit execution to minion account only.
    modifier minionOnly() {
        require(minions_[msg.sender], "minion_only");
        _;
    }

    /// @dev Limit execution to test time only.
    modifier testModeOnly {
        require(mode_ == Mode.TEST, "test_mode_only");
        _;
    }

    /// @dev Limit execution to presale time only.
    modifier presaleModeOnly {
        require(mode_ == Mode.PRESALE, "presale_mode_only");
        _;
    }

    /// @dev Limit execution to operate time only.
    modifier operateModeOnly {
        require(mode_ == Mode.OPERATE, "operate_mode_only");
        _;
    }

     /// @dev Limit execution to presale account only.
    modifier presaleOnly() {
        require(msg.sender == presale_, "presale_only");
        _;
    }

    /// @dev set state to Mode.OPERATE.
    function setOperateMode()
        external 
        controllerOnly
        presaleModeOnly
    {
        mode_ = Mode.OPERATE;
    }

    /// @dev Set presale contract address. Becomes useless when presale is over.
    /// @param _presale Presale contract address.
    function setPresale(address _presale)
        external
        controllerOnly
    {
        presale_ = _presale;
    }

    /// @dev set state to Mode.PRESALE.
    function setPresaleMode()
        external
        controllerOnly
        testModeOnly
    {
        mode_ = Mode.PRESALE;
    }    

        /// @dev Get controller address.
    /// @return Address of contract's controller.
    function controller()
        external
        view
        returns(address)
    {
        return controller_;
    }

    /// @dev Transfer control to new address. Set controller an approvee for
    /// tokens that managed by contract itself. Remove previous controller value
    /// from contract's approvees.
    /// @param _to New controller address.
    function setController(address _to)
        external
        controllerOnly
    {
        require(_to != NA, "_to");
        require(controller_ != _to, "already_controller");

        controller_ = _to;
    }

    /// @dev Check if address is a minion.
    /// @param _addr Address to check.
    /// @return True if address is a minion.
    function isMinion(address _addr)
        public view returns(bool)
    {
        return minions_[_addr];
    }   

    function getCurrentMode() 
        public view returns (Mode) 
    {
        return mode_;
    }    
}

/// @dev token description, storage and transfer functions
contract DragonBase is DragonAccessControl
{
    using SafeMath8 for uint8;
    using SafeMath32 for uint32;
    using SafeMath256 for uint256;
    using StringUtils for string;
    using UintStringUtils for uint;    

    /// @dev The Birth event is fired whenever a new dragon comes into existence. 
    event Birth(address owner, uint256 petId, uint256 tokenId, uint256 parentA, uint256 parentB, string genes, string params);

    /// @dev Token name
    string internal name_;
    /// @dev Token symbol
    string internal symbol_;
    /// @dev Token resolving url
    string internal url_;

    struct DragonToken {
        // Constant Token params
        uint8   genNum;  // generation number. uses for dragon view
        string  genome;  // genome description
        uint256 petId;   // offchain dragon identifier

        // Parents
        uint256 parentA;
        uint256 parentB;

        // Game-depening Token params
        string  params;  // can change in export operation

        // State
        address owner; 
    }

    /// @dev Count of minted tokens
    uint256 internal mintCount_;
    /// @dev Maximum token supply
    uint256 internal maxSupply_;
     /// @dev Count of burn tokens
    uint256 internal burnCount_;

    // Tokens state
    /// @dev Token approvals values
    mapping(uint256 => address) internal approvals_;
    /// @dev Operator approvals
    mapping(address => mapping(address => bool)) internal operatorApprovals_;
    /// @dev Index of token in owner's token list
    mapping(uint256 => uint256) internal ownerIndex_;
    /// @dev Owner's tokens list
    mapping(address => uint256[]) internal ownTokens_;
    /// @dev Tokens
    mapping(uint256 => DragonToken) internal tokens_;

    // @dev Non Assigned address.
    address constant NA = address(0);

    /// @dev Add token to new owner. Increase owner's balance.
    /// @param _to Token receiver.
    /// @param _tokenId New token id.
    function _addTo(address _to, uint256 _tokenId)
        internal
    {
        DragonToken storage token = tokens_[_tokenId];
        require(token.owner == NA, "taken");

        uint256 lastIndex = ownTokens_[_to].length;
        ownTokens_[_to].push(_tokenId);
        ownerIndex_[_tokenId] = lastIndex;

        token.owner = _to;
    }

    /// @dev Create new token and increase mintCount.
    /// @param _genome New token's genome.
    /// @param _params Token params string. 
    /// @param _parentA Token A parent.
    /// @param _parentB Token B parent.
    /// @return New token id.
    function _createToken(
        address _to,
        
        // Constant Token params
        uint8   _genNum,
        string   _genome,
        uint256 _parentA,
        uint256 _parentB,
        
        // Game-depening Token params
        uint256 _petId,
        string   _params        
    )
        internal returns(uint256)
    {
        uint256 tokenId = mintCount_.add(1);
        mintCount_ = tokenId;

        DragonToken memory token = DragonToken(
            _genNum,
            _genome,
            _petId,

            _parentA,
            _parentB,

            _params,
            NA
        );
        
        tokens_[tokenId] = token;
        
        _addTo(_to, tokenId);
        
        emit Birth(_to, _petId, tokenId, _parentA, _parentB, _genome, _params);
        
        return tokenId;
    }    
 
    /// @dev Get token genome.
    /// @param _tokenId Token id.
    /// @return Token's genome.
    function getGenome(uint256 _tokenId)
        external view returns(string)
    {
        return tokens_[_tokenId].genome;
    }

    /// @dev Get token params.
    /// @param _tokenId Token id.
    /// @return Token's params.
    function getParams(uint256 _tokenId)
        external view returns(string)
    {
        return tokens_[_tokenId].params;
    }

    /// @dev Get token parentA.
    /// @param _tokenId Token id.
    /// @return Parent token id.
    function getParentA(uint256 _tokenId)
        external view returns(uint256)
    {
        return tokens_[_tokenId].parentA;
    }   

    /// @dev Get token parentB.
    /// @param _tokenId Token id.
    /// @return Parent token id.
    function getParentB(uint256 _tokenId)
        external view returns(uint256)
    {
        return tokens_[_tokenId].parentB;
    }

    /// @dev Check if `_tokenId` exists. Check if owner is not addres(0).
    /// @param _tokenId Token id
    /// @return Return true if token owner is real.
    function isExisting(uint256 _tokenId)
        public view returns(bool)
    {
        return tokens_[_tokenId].owner != NA;
    }    

    /// @dev Receive maxium token supply value.
    /// @return Contracts `maxSupply_` variable.
    function maxSupply()
        external view returns(uint256)
    {
        return maxSupply_;
    }

    /// @dev Set url prefix for tokenURI generation.
    /// @param _url Url prefix value.
    function setUrl(string _url)
        external controllerOnly
    {
        url_ = _url;
    }

    /// @dev Get token symbol.
    /// @return Token symbol name.
    function symbol()
        external view returns(string)
    {
        return symbol_;
    }

    /// @dev Get token URI to receive offchain information by it's id.
    /// @param _tokenId Token id.
    /// @return URL string. For example "http://erc721.tld/tokens/1".
    function tokenURI(uint256 _tokenId)
        external view returns(string)
    {
        return url_.concat(_tokenId.toString());
    }

     /// @dev Get token name.
    /// @return Token name string.
    function name()
        external view returns(string)
    {
        return name_;
    }

    /// @dev return information about _owner tokens
    function getTokens(address _owner)
        external view  returns (uint256[], uint256[], byte[]) 
    {
        uint256[] memory tokens = ownTokens_[_owner];
        uint256[] memory tokenIds = new uint256[](tokens.length);
        uint256[] memory petIds = new uint256[](tokens.length);

        byte[] memory genomes = new byte[](tokens.length * 77);
        uint index = 0;

        for(uint i = 0; i < tokens.length; i++) {
            uint256 tokenId = tokens[i];
            
            DragonToken storage token = tokens_[tokenId];

            tokenIds[i] = tokenId;
            petIds[i] = token.petId;
            
            bytes storage genome = bytes(token.genome);
            
            for(uint j = 0; j < genome.length; j++) {
                genomes[index++] = genome[j];
            }
        }
        return (tokenIds, petIds, genomes);
    }
    
}

/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @dev See https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721.sol

contract ERC721Basic 
{
    /// @dev Emitted when token approvee is set
    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
    /// @dev Emitted when owner approve all own tokens to operator.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    /// @dev Emitted when user deposit some funds.
    event Deposit(address indexed _sender, uint256 _value);
    /// @dev Emitted when user deposit some funds.
    event Withdraw(address indexed _sender, uint256 _value);
    /// @dev Emitted when token transferred to new owner
    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);

    // Required methods
    function balanceOf(address _owner) external view returns (uint256 _balance);
    function ownerOf(uint256 _tokenId) public view returns (address _owner);
    function exists(uint256 _tokenId) public view returns (bool _exists);
    
    function approve(address _to, uint256 _tokenId) external;
    function getApproved(uint256 _tokenId) public view returns (address _to);

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

    function totalSupply() public view returns (uint256 total);

    // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

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


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

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

/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Metadata, ERC721Receiver 
{
    /// @dev Interface signature 721 for interface detection.
    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

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

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

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

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

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

/// @dev ERC721 methods
contract DragonOwnership is ERC721, DragonBase
{
    using StringUtils for string;
    using UintStringUtils for uint;    
    using AddressUtils for address;

    /// @dev Emitted when token transferred to new owner. Additional fields is petId, genes, params
    /// it uses for client-side indication
    event TransferInfo(address indexed _from, address indexed _to, uint256 _tokenId, uint256 petId, string genes, string params);

    /// @dev Specify if _addr is token owner or approvee. Also check if `_addr`
    /// is operator for token owner.
    /// @param _tokenId Token to check ownership of.
    /// @param _addr Address to check if it's an owner or an aprovee of `_tokenId`.
    /// @return True if token can be managed by provided `_addr`.
    function isOwnerOrApproved(uint256 _tokenId, address _addr)
        public view returns(bool)
    {
        DragonToken memory token = tokens_[_tokenId];

        if (token.owner == _addr) {
            return true;
        }
        else if (isApprovedFor(_tokenId, _addr)) {
            return true;
        }
        else if (isApprovedForAll(token.owner, _addr)) {
            return true;
        }

        return false;
    }

    /// @dev Limit execution to token owner or approvee only.
    /// @param _tokenId Token to check ownership of.
    modifier ownerOrApprovedOnly(uint256 _tokenId) {
        require(isOwnerOrApproved(_tokenId, msg.sender), "tokenOwnerOrApproved_only");
        _;
    }

    /// @dev Contract's own token only acceptable.
    /// @param _tokenId Contract's token id.
    modifier ownOnly(uint256 _tokenId) {
        require(tokens_[_tokenId].owner == address(this), "own_only");
        _;
    }

    /// @dev Determine if token is approved for specified approvee.
    /// @param _tokenId Target token id.
    /// @param _approvee Approvee address.
    /// @return True if so.
    function isApprovedFor(uint256 _tokenId, address _approvee)
        public view returns(bool)
    {
        return approvals_[_tokenId] == _approvee;
    }

    /// @dev Specify is given address set as operator with setApprovalForAll.
    /// @param _owner Token owner.
    /// @param _operator Address to check if it an operator.
    /// @return True if operator is set.
    function isApprovedForAll(address _owner, address _operator)
        public view returns(bool)
    {
        return operatorApprovals_[_owner][_operator];
    }

    /// @dev Check if `_tokenId` exists. Check if owner is not addres(0).
    /// @param _tokenId Token id
    /// @return Return true if token owner is real.
    function exists(uint256 _tokenId)
        public view returns(bool)
    {
        return tokens_[_tokenId].owner != NA;
    }

    /// @dev Get owner of a token.
    /// @param _tokenId Token owner id.
    /// @return Token owner address.
    function ownerOf(uint256 _tokenId)
        public view returns(address)
    {
        return tokens_[_tokenId].owner;
    }

    /// @dev Get approvee address. If there is not approvee returns 0x0.
    /// @param _tokenId Token id to get approvee of.
    /// @return Approvee address or 0x0.
    function getApproved(uint256 _tokenId)
        public view returns(address)
    {
        return approvals_[_tokenId];
    }

    /// @dev Grant owner alike controll permissions to third party.
    /// @param _to Permission receiver.
    /// @param _tokenId Granted token id.
    function approve(address _to, uint256 _tokenId)
        external ownerOrApprovedOnly(_tokenId)
    {
        address owner = ownerOf(_tokenId);
        require(_to != owner);

        if (getApproved(_tokenId) != NA || _to != NA) {
            approvals_[_tokenId] = _to;

            emit Approval(owner, _to, _tokenId);
        }
    }

    /// @dev Current total tokens supply. Always less then maxSupply.
    /// @return Difference between minted and burned tokens.
    function totalSupply()
        public view returns(uint256)
    {
        return mintCount_;
    }    

    /// @dev Get number of tokens which `_owner` owns.
    /// @param _owner Address to count own tokens.
    /// @return Count of owned tokens.
    function balanceOf(address _owner)
        external view returns(uint256)
    {
        return ownTokens_[_owner].length;
    }    

    /// @dev Internal set approval for all without _owner check.
    /// @param _owner Granting user.
    /// @param _to New account approvee.
    /// @param _approved Set new approvee status.
    function _setApprovalForAll(address _owner, address _to, bool _approved)
        internal
    {
        operatorApprovals_[_owner][_to] = _approved;

        emit ApprovalForAll(_owner, _to, _approved);
    }

    /// @dev Set approval for all account tokens.
    /// @param _to Approvee address.
    /// @param _approved Value true or false.
    function setApprovalForAll(address _to, bool _approved)
        external
    {
        require(_to != msg.sender);

        _setApprovalForAll(msg.sender, _to, _approved);
    }

    /// @dev Remove approval bindings for token. Do nothing if no approval
    /// exists.
    /// @param _from Address of token owner.
    /// @param _tokenId Target token id.
    function _clearApproval(address _from, uint256 _tokenId)
        internal
    {
        if (approvals_[_tokenId] == NA) {
            return;
        }

        approvals_[_tokenId] = NA;
        emit Approval(_from, NA, _tokenId);
    }

    /// @dev Check if contract was received by other side properly if receiver
    /// is a ctontract.
    /// @param _from Current token owner.
    /// @param _to New token owner.
    /// @param _tokenId token Id.
    /// @param _data Transaction data.
    /// @return True on success.
    function _checkAndCallSafeTransfer(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
        internal returns(bool)
    {
        if (! _to.isContract()) {
            return true;
        }

        bytes4 retval = ERC721Receiver(_to).onERC721Received(
            _from, _tokenId, _data
        );

        return (retval == ERC721_RECEIVED);
    }

    /// @dev Remove token from owner. Unrecoverable.
    /// @param _tokenId Removing token id.
    function _remove(uint256 _tokenId)
        internal
    {
        address owner = tokens_[_tokenId].owner;
        _removeFrom(owner, _tokenId);
    }

    /// @dev Completely remove token from the contract. Unrecoverable.
    /// @param _owner Owner of removing token.
    /// @param _tokenId Removing token id.
    function _removeFrom(address _owner, uint256 _tokenId)
        internal
    {
        uint256 lastIndex = ownTokens_[_owner].length.sub(1);
        uint256 lastToken = ownTokens_[_owner][lastIndex];

        // Swap users token
        ownTokens_[_owner][ownerIndex_[_tokenId]] = lastToken;
        ownTokens_[_owner].length--;

        // Swap token indexes
        ownerIndex_[lastToken] = ownerIndex_[_tokenId];
        ownerIndex_[_tokenId] = 0;

        DragonToken storage token = tokens_[_tokenId];
        token.owner = NA;
    }

    /// @dev Transfer token from owner `_from` to another address or contract
    /// `_to` by it's `_tokenId`.
    /// @param _from Current token owner.
    /// @param _to New token owner.
    /// @param _tokenId token Id.
    function transferFrom( address _from, address _to, uint256 _tokenId )
        public ownerOrApprovedOnly(_tokenId)
    {
        require(_from != NA);
        require(_to != NA);

        _clearApproval(_from, _tokenId);
        _removeFrom(_from, _tokenId);
        _addTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);

        DragonToken storage token = tokens_[_tokenId];
        emit TransferInfo(_from, _to, _tokenId, token.petId, token.genome, token.params);
    }

    /// @dev Update token params and transfer to new owner. Only contract's own
    /// tokens could be updated. Also notifies receiver of the token.
    /// @param _to Address to transfer token to.
    /// @param _tokenId Id of token that should be transferred.
    /// @param _params New token params.
    function updateAndSafeTransferFrom(
        address _to,
        uint256 _tokenId,
        string _params
    )
        public
    {
        updateAndSafeTransferFrom(_to, _tokenId, _params, "");
    }

    /// @dev Update token params and transfer to new owner. Only contract's own
    /// tokens could be updated. Also notifies receiver of the token and send
    /// protion of _data to it.
    /// @param _to Address to transfer token to.
    /// @param _tokenId Id of token that should be transferred.
    /// @param _params New token params.
    /// @param _data Notification data.
    function updateAndSafeTransferFrom(
        address _to,
        uint256 _tokenId,
        string _params,
        bytes _data
    )
        public
    {
        // Safe transfer from
        updateAndTransferFrom(_to, _tokenId, _params, 0, 0);
        require(_checkAndCallSafeTransfer(address(this), _to, _tokenId, _data));
    }

    /// @dev Update token params and transfer to new owner. Only contract's own
    /// tokens could be updated.
    /// @param _to Address to transfer token to.
    /// @param _tokenId Id of token that should be transferred.
    /// @param _params New token params.
    function updateAndTransferFrom(
        address _to,
        uint256 _tokenId,
        string _params,
        uint256 _petId, 
        uint256 _transferCost
    )
        public
        ownOnly(_tokenId)
        minionOnly
    {
        require(bytes(_params).length > 0, "params_length");

        // Update
        tokens_[_tokenId].params = _params;
        if (tokens_[_tokenId].petId == 0 ) {
            tokens_[_tokenId].petId = _petId;
        }

        address from = tokens_[_tokenId].owner;

        // Transfer from
        transferFrom(from, _to, _tokenId);

        // send to the server's wallet the transaction cost
        // withdraw it from the balance of the contract. this amount must be withdrawn from the player
        // on the side of the game server        
        if (_transferCost > 0) {
            msg.sender.transfer(_transferCost);
        }
    }

    /// @dev Transfer token from one owner to new one and check if it was
    /// properly received if receiver is a contact.
    /// @param _from Current token owner.
    /// @param _to New token owner.
    /// @param _tokenId token Id.
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
        public
    {
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /// @dev Transfer token from one owner to new one and check if it was
    /// properly received if receiver is a contact.
    /// @param _from Current token owner.
    /// @param _to New token owner.
    /// @param _tokenId token Id.
    /// @param _data Transaction data.
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
        public
    {
        transferFrom(_from, _to, _tokenId);
        require(_checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
    }

    /// @dev Burn owned token. Increases `burnCount_` and decrease `totalSupply`
    /// value.
    /// @param _tokenId Id of burning token.
    function burn(uint256 _tokenId)
        public
        ownerOrApprovedOnly(_tokenId)
    {
        address owner = tokens_[_tokenId].owner;
        _remove(_tokenId);

        burnCount_ += 1;

        emit Transfer(owner, NA, _tokenId);
    }

    /// @dev Receive count of burned tokens. Should be greater than `totalSupply`
    /// but less than `mintCount`.
    /// @return Number of burned tokens
    function burnCount()
        external
        view
        returns(uint256)
    {
        return burnCount_;
    }

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



/// @title Managing contract. implements the logic of buying tokens, depositing / withdrawing funds 
/// to the project account and importing / exporting tokens
contract EtherDragonsCore is DragonOwnership 
{
    using SafeMath8 for uint8;
    using SafeMath32 for uint32;
    using SafeMath256 for uint256;
    using AddressUtils for address;
    using StringUtils for string;
    using UintStringUtils for uint;

    // @dev Non Assigned address.
    address constant NA = address(0);

    /// @dev Bounty tokens count limit
    uint256 public constant BOUNTY_LIMIT = 2500;
    /// @dev Presale tokens count limit
    uint256 public constant PRESALE_LIMIT = 7500;
    ///@dev Total gen0tokens generation limit
    uint256 public constant GEN0_CREATION_LIMIT = 90000;
    
    /// @dev Number of tokens minted in presale stage
    uint256 internal presaleCount_;  
    /// @dev Number of tokens minted for bounty campaign
    uint256 internal bountyCount_;
   
    ///@dev Company bank address
    address internal bank_;

    // Extension ---------------------------------------------------------------

    /// @dev Contract is not payable. To fullfil balance method `depositTo`
    /// should be used.
    function ()
        public payable
    {
        revert();
    }

    /// @dev amount on the account of the contract. This amount consists of deposits  from players and the system reserve for payment of transactions
    /// the player at any time to withdraw the amount corresponding to his account in the game, minus the cost of the transaction 
    function getBalance() 
        public view returns (uint256)
    {
        return address(this).balance;
    }    

    /// @dev at the moment of creation of the contract we transfer the address of the bank
    /// presell contract address set later
    constructor(
        address _bank
    )
        public
    {
        require(_bank != NA);
        
        controller_ = msg.sender;
        bank_ = _bank;
        
        // Meta
        name_ = "EtherDragons";
        symbol_ = "ED";
        url_ = "https://game.etherdragons.world/token/";

        // Token mint limit
        maxSupply_ = GEN0_CREATION_LIMIT + BOUNTY_LIMIT + PRESALE_LIMIT;
    }

    /// Number of tokens minted in presale stage
    function totalPresaleCount()
        public view returns(uint256)
    {
        return presaleCount_;
    }    

    /// @dev Number of tokens minted for bounty campaign
    function totalBountyCount()
        public view returns(uint256)
    {
        return bountyCount_;
    }    
    
    /// @dev Check if new token could be minted. Return true if count of minted
    /// tokens less than could be minted through contract deploy.
    /// Also, tokens can not be created more often than once in mintDelay_ minutes
    /// @return True if current count is less then maximum tokens available for now.
    function canMint()
        public view returns(bool)
    {
        return (mintCount_ + presaleCount_ + bountyCount_) < maxSupply_;
    }

    /// @dev Here we write the addresses of the wallets of the server from which it is accessed
    /// to contract methods.
    /// @param _to New minion address
    function minionAdd(address _to)
        external controllerOnly
    {
        require(minions_[_to] == false, "already_minion");
        
        // разрешаем этому адресу пользоваться токенами контакта
        // allow the address to use contract tokens 
        _setApprovalForAll(address(this), _to, true);
        
        minions_[_to] = true;
    }

    /// @dev delete the address of the server wallet
    /// @param _to Minion address
    function minionRemove(address _to)
        external controllerOnly
    {
        require(minions_[_to], "not_a_minion");

        // and forbid this wallet to use tokens of the contract
        _setApprovalForAll(address(this), _to, false);
        minions_[_to] = false;
    }

    /// @dev Here the player can put funds to the account of the contract
    /// and get the same amount of in-game currency
    /// the game server understands who puts money at the wallet address
    function depositTo()
        public payable
    {
        emit Deposit(msg.sender, msg.value);
    }    
    
    /// @dev Transfer amount of Ethers to specified receiver. Only owner can
    // call this method.
    /// @param _to Transfer receiver.
    /// @param _amount Transfer value.
    /// @param _transferCost Transfer cost.
    function transferAmount(address _to, uint256 _amount, uint256 _transferCost)
        external minionOnly
    {
        require((_amount + _transferCost) <= address(this).balance, "not enough money!");
        _to.transfer(_amount);

        // send to the wallet of the server the transfer cost
        // withdraw  it from the balance of the contract. this amount must be withdrawn from the player
        // on the side of the game server
        if (_transferCost > 0) {
            msg.sender.transfer(_transferCost);
        }

        emit Withdraw(_to, _amount);
    }        

   /// @dev Mint new token with specified params. Transfer `_fee` to the
    /// `bank`. 
    /// @param _to New token owner.
    /// @param _fee Transaction fee.
    /// @param _genNum Generation number..
    /// @param _genome New genome unique value.
    /// @param _parentA Parent A.
    /// @param _parentB Parent B.
    /// @param _petId Pet identifier.
    /// @param _params List of parameters for pet.
    /// @param _transferCost Transfer cost.
    /// @return New token id.
    function mintRelease(
        address _to,
        uint256 _fee,
        
        // Constant Token params
        uint8   _genNum,
        string   _genome,
        uint256 _parentA,
        uint256 _parentB,
        
        // Game-depening Token params
        uint256 _petId,  //if petID = 0, then it was created outside of the server
        string   _params,
        uint256 _transferCost
    )
        external minionOnly operateModeOnly returns(uint256)
    {
        require(canMint(), "can_mint");
        require(_to != NA, "_to");
        require((_fee + _transferCost) <= address(this).balance, "_fee");
        require(bytes(_params).length != 0, "params_length");
        require(bytes(_genome).length == 77, "genome_length");
        
        // Parents should be both 0 or both not.
        if (_parentA != 0 && _parentB != 0) {
            require(_parentA != _parentB, "same_parent");
        }
        else if (_parentA == 0 && _parentB != 0) {
            revert("parentA_empty");
        }
        else if (_parentB == 0 && _parentA != 0) {
            revert("parentB_empty");
        }

        uint256 tokenId = _createToken(_to, _genNum, _genome, _parentA, _parentB, _petId, _params);

        require(_checkAndCallSafeTransfer(NA, _to, tokenId, ""), "safe_transfer");

        // Transfer mint fee to the fund
        CommonWallet(bank_).receive.value(_fee)();

        emit Transfer(NA, _to, tokenId);

        // send to the server wallet server the transfer cost,
        // withdraw it from the balance of the contract. this amount must be withdrawn from the player
        // on the side of the game server
        if (_transferCost > 0) {
            msg.sender.transfer(_transferCost);
        }

        return tokenId;
    }

    /// @dev Create new token via presale state
    /// @param _to New token owner.
    /// @param _genome New genome unique value.
    /// @return New token id.
    /// at the pre-sale stage we sell the zero-generation pets, which have only a genome.
    /// other attributes of such a token get when importing to the server
    function mintPresell(address _to, string _genome)
        external presaleOnly presaleModeOnly returns(uint256)
    {
        require(presaleCount_ < PRESALE_LIMIT, "presale_limit");

        // у пресейл пета нет параметров. Их он получит после ввода в игру.
        uint256 tokenId = _createToken(_to, 0, _genome, 0, 0, 0, "");
        presaleCount_ += 1;

        require(_checkAndCallSafeTransfer(NA, _to, tokenId, ""), "safe_transfer");

        emit Transfer(NA, _to, tokenId);
        
        return tokenId;
    }    
    
    /// @dev Create new token for bounty activity
    /// @param _to New token owner.
    /// @return New token id.
    function mintBounty(address _to, string _genome)
        external controllerOnly returns(uint256)
    {
        require(bountyCount_ < BOUNTY_LIMIT, "bounty_limit");

        // bounty pet has no parameters. They will receive them after importing to the game.
        uint256 tokenId = _createToken(_to, 0, _genome, 0, 0, 0, "");
    
        bountyCount_ += 1;
        require(_checkAndCallSafeTransfer(NA, _to, tokenId, ""), "safe_transfer");

        emit Transfer(NA, _to, tokenId);

        return tokenId;
    }        
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"minionAdd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"minionRemove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"depositTo","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getParams","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentMode","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PRESALE_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_url","type":"string"}],"name":"setUrl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_genome","type":"string"}],"name":"mintPresell","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getTokens","outputs":[{"name":"","type":"uint256[]"},{"name":"","type":"uint256[]"},{"name":"","type":"bytes1[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_transferCost","type":"uint256"}],"name":"transferAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getGenome","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GEN0_CREATION_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BOUNTY_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_genome","type":"string"}],"name":"mintBounty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_addr","type":"address"}],"name":"isOwnerOrApproved","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getParentA","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_fee","type":"uint256"},{"name":"_genNum","type":"uint8"},{"name":"_genome","type":"string"},{"name":"_parentA","type":"uint256"},{"name":"_parentB","type":"uint256"},{"name":"_petId","type":"uint256"},{"name":"_params","type":"string"},{"name":"_transferCost","type":"uint256"}],"name":"mintRelease","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_approvee","type":"address"}],"name":"isApprovedFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setPresaleMode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isExisting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_params","type":"string"},{"name":"_petId","type":"uint256"},{"name":"_transferCost","type":"uint256"}],"name":"updateAndTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"canMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setOperateMode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_presale","type":"address"}],"name":"setPresale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isMinion","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_params","type":"string"},{"name":"_data","type":"bytes"}],"name":"updateAndSafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_params","type":"string"}],"name":"updateAndSafeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPresaleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalBountyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getParentB","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_bank","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"},{"indexed":false,"name":"petId","type":"uint256"},{"indexed":false,"name":"genes","type":"string"},{"indexed":false,"name":"params","type":"string"}],"name":"TransferInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"petId","type":"uint256"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"parentA","type":"uint256"},{"indexed":false,"name":"parentB","type":"uint256"},{"indexed":false,"name":"genes","type":"string"},{"indexed":false,"name":"params","type":"string"}],"name":"Birth","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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040526000805460a060020a60ff02191690553480156200002157600080fd5b50604051602080620039d28339810160405251600160a060020a03811615156200004a57600080fd5b6000805433600160a060020a03199182161790915560108054909116600160a060020a03831617905560408051808201909152600c8082527f4574686572447261676f6e7300000000000000000000000000000000000000006020909201918252620000b9916003916200017e565b506040805180820190915260028082527f4544000000000000000000000000000000000000000000000000000000000000602090920191825262000100916004916200017e565b506040805160608101825260268082527f68747470733a2f2f67616d652e6574686572647261676f6e732e776f726c642f602083019081527f746f6b656e2f000000000000000000000000000000000000000000000000000092909301919091526200016f916005916200017e565b5050620186a060075562000223565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001c157805160ff1916838001178555620001f1565b82800160010185558215620001f1579182015b82811115620001f1578251825591602001919060010190620001d4565b50620001ff92915062000203565b5090565b6200022091905b80821115620001ff57600081556001016200020a565b90565b61379f80620002336000396000f3006080604052600436106102585763ffffffff60e060020a60003504166301ffc9a7811461025d57806304612d2014610293578063065de1f6146102b657806306a248c6146102d757806306fdde03146102df578063081812fc1461036957806308a4f0721461039d578063095ea7b3146103b557806312065fe0146103d9578063153705981461040057806318160ddd146104395780631aee3f911461044e57806323b872dd14610463578063252498a21461048d5780632774d052146104ad57806342842e0e146104da57806342966c6814610504578063450efe211461051c5780634f558e791461061b578063524773ce1461063357806355ce15f4146106485780636352211e1461066f57806365d6759a14610687578063680eba271461069f57806370a08231146106b457806392eefe9b146106d557806395d89b41146106f6578063987b904b1461070b5780639a04e60214610720578063a0ee153e1461074d578063a22cb46514610771578063b2444a7014610797578063b3cf6e83146107af578063b5b12e7514610803578063b85e7df114610827578063b88d4fde1461083c578063b92cc8cf1461061b578063bba90086146108ab578063beb9716d1461091d578063c87b56dd14610932578063c8857dcd1461094a578063d5abeb011461095f578063d5fcc7b614610974578063dfafcf7e14610995578063e4d5a558146109b6578063e629837c14610a5d578063e985e9c514610ac6578063ee2f00a814610aed578063f0b9e5ba14610b02578063f672c1aa14610b88578063f77c479114610b9d578063fc7c1c8014610bb2575b600080fd5b34801561026957600080fd5b5061027f600160e060020a031960043516610bca565b604080519115158252519081900360200190f35b34801561029f57600080fd5b506102b4600160a060020a0360043516610c9b565b005b3480156102c257600080fd5b506102b4600160a060020a0360043516610d8f565b6102b4610e7e565b3480156102eb57600080fd5b506102f4610eb6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032e578181015183820152602001610316565b50505050905090810190601f16801561035b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037557600080fd5b50610381600435610f4d565b60408051600160a060020a039092168252519081900360200190f35b3480156103a957600080fd5b506102f4600435610f68565b3480156103c157600080fd5b506102b4600160a060020a036004351660243561100c565b3480156103e557600080fd5b506103ee61112c565b60408051918252519081900360200190f35b34801561040c57600080fd5b50610415611131565b6040518082600281111561042557fe5b60ff16815260200191505060405180910390f35b34801561044557600080fd5b506103ee611141565b34801561045a57600080fd5b506103ee611147565b34801561046f57600080fd5b506102b4600160a060020a036004358116906024351660443561114d565b34801561049957600080fd5b506102b460048035602481019101356113af565b3480156104b957600080fd5b506103ee60048035600160a060020a03169060248035908101910135611410565b3480156104e657600080fd5b506102b4600160a060020a036004358116906024351660443561164c565b34801561051057600080fd5b506102b4600435611668565b34801561052857600080fd5b5061053d600160a060020a036004351661172e565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561058557818101518382015260200161056d565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156105c45781810151838201526020016105ac565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156106035781810151838201526020016105eb565b50505050905001965050505050505060405180910390f35b34801561062757600080fd5b5061027f600435611995565b34801561063f57600080fd5b506103ee6119b5565b34801561065457600080fd5b506102b4600160a060020a03600435166024356044356119bb565b34801561067b57600080fd5b50610381600435611b32565b34801561069357600080fd5b506102f4600435611b50565b3480156106ab57600080fd5b506103ee611bd1565b3480156106c057600080fd5b506103ee600160a060020a0360043516611bd8565b3480156106e157600080fd5b506102b4600160a060020a0360043516611bf3565b34801561070257600080fd5b506102f4611d2b565b34801561071757600080fd5b506103ee611d8c565b34801561072c57600080fd5b506103ee60048035600160a060020a03169060248035908101910135611d92565b34801561075957600080fd5b5061027f600435600160a060020a0360243516611ebe565b34801561077d57600080fd5b506102b4600160a060020a036004351660243515156120b9565b3480156107a357600080fd5b506103ee6004356120de565b3480156107bb57600080fd5b506103ee60048035600160a060020a031690602480359160443560ff16916064358082019290810135916084359160a4359160c4359160e435918201910135610104356120f3565b34801561080f57600080fd5b5061027f600435600160a060020a036024351661269f565b34801561083357600080fd5b506102b46126c0565b34801561084857600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526102b494600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506127ac9650505050505050565b3480156108b757600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b4948235600160a060020a03169460248035953695946064949201919081908401838280828437509497505084359550505060209092013591506127ce9050565b34801561092957600080fd5b5061027f6129bf565b34801561093e57600080fd5b506102f46004356129d1565b34801561095657600080fd5b506102b4612a78565b34801561096b57600080fd5b506103ee612b62565b34801561098057600080fd5b506102b4600160a060020a0360043516612b68565b3480156109a157600080fd5b5061027f600160a060020a0360043516612bda565b3480156109c257600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b4948235600160a060020a031694602480359536959460649492019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612bf89650505050505050565b348015610a6957600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b4948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750612c129650505050505050565b348015610ad257600080fd5b5061027f600160a060020a0360043581169060243516612c2e565b348015610af957600080fd5b506103ee612c5c565b348015610b0e57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610b6b948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750612c629650505050505050565b60408051600160e060020a03199092168252519081900360200190f35b348015610b9457600080fd5b506103ee612c8a565b348015610ba957600080fd5b50610381612c90565b348015610bbe57600080fd5b506103ee600435612c9f565b6000600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610c2d5750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b80610c615750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c955750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b92915050565b600054600160a060020a03163314610ceb576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460ff1615610d5c576040805160e560020a62461bcd02815260206004820152600e60248201527f616c72656164795f6d696e696f6e000000000000000000000000000000000000604482015290519081900360640190fd5b610d6830826001612cb4565b600160a060020a03166000908152600160208190526040909120805460ff19169091179055565b600054600160a060020a03163314610ddf576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460ff161515610e51576040805160e560020a62461bcd02815260206004820152600c60248201527f6e6f745f615f6d696e696f6e0000000000000000000000000000000000000000604482015290519081900360640190fd5b610e5d30826000612cb4565b600160a060020a03166000908152600160205260409020805460ff19169055565b60408051348152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a2565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f425780601f10610f1757610100808354040283529160200191610f42565b820191906000526020600020905b815481529060010190602001808311610f2557829003601f168201915b505050505090505b90565b600090815260096020526040902054600160a060020a031690565b6000818152600d602090815260409182902060050180548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156110005780601f10610fd557610100808354040283529160200191611000565b820191906000526020600020905b815481529060010190602001808311610fe357829003601f168201915b50505050509050919050565b6000816110198133611ebe565b151561106f576040805160e560020a62461bcd02815260206004820152601960248201527f746f6b656e4f776e65724f72417070726f7665645f6f6e6c7900000000000000604482015290519081900360640190fd5b61107883611b32565b9150600160a060020a03848116908316141561109357600080fd5b600061109e84610f4d565b600160a060020a03161415806110bc5750600160a060020a03841615155b15611126576000838152600960209081526040918290208054600160a060020a031916600160a060020a03888116918217909255835187815293519093918616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b50505050565b303190565b60005460a060020a900460ff1690565b60065490565b611d4c81565b60008161115a8133611ebe565b15156111b0576040805160e560020a62461bcd02815260206004820152601960248201527f746f6b656e4f776e65724f72417070726f7665645f6f6e6c7900000000000000604482015290519081900360640190fd5b600160a060020a03851615156111c557600080fd5b600160a060020a03841615156111da57600080fd5b6111e48584612d22565b6111ee8584612da2565b6111f88484612eb1565b83600160a060020a031685600160a060020a0316600080516020613754833981519152856040518082815260200191505060405180910390a3600d6000848152602001908152602001600020915083600160a060020a031685600160a060020a03167ff8e997dde8af4eab36d99980a4c48ae36f5da5d59eddf67ced297098e635222685856002015486600101876005016040518085815260200184815260200180602001806020018381038352858181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156113225780601f106112f757610100808354040283529160200191611322565b820191906000526020600020905b81548152906001019060200180831161130557829003601f168201915b50508381038252845460026000196101006001841615020190911604808252602090910190859080156113965780601f1061136b57610100808354040283529160200191611396565b820191906000526020600020905b81548152906001019060200180831161137957829003601f168201915b5050965050505050505060405180910390a35050505050565b600054600160a060020a031633146113ff576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b61140b600583836135c3565b505050565b6002546000908190600160a060020a03163314611477576040805160e560020a62461bcd02815260206004820152600c60248201527f70726573616c655f6f6e6c790000000000000000000000000000000000000000604482015290519081900360640190fd5b600160005460a060020a900460ff16600281111561149157fe5b146114e6576040805160e560020a62461bcd02815260206004820152601160248201527f70726573616c655f6d6f64655f6f6e6c79000000000000000000000000000000604482015290519081900360640190fd5b600e54611d4c11611541576040805160e560020a62461bcd02815260206004820152600d60248201527f70726573616c655f6c696d697400000000000000000000000000000000000000604482015290519081900360640190fd5b61159585600086868080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505060008060006020604051908101604052806000815250612f7b565b600e80546001019055604080516020810190915260008082529192506115bf9190879084906131cb565b1515611615576040805160e560020a62461bcd02815260206004820152600d60248201527f736166655f7472616e7366657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080518281529051600160a060020a038716916000916000805160206137548339815191529181900360200190a3949350505050565b61140b83838360206040519081016040528060008152506127ac565b6000816116758133611ebe565b15156116cb576040805160e560020a62461bcd02815260206004820152601960248201527f746f6b656e4f776e65724f72417070726f7665645f6f6e6c7900000000000000604482015290519081900360640190fd5b6000838152600d6020526040902060060154600160a060020a031691506116f183613323565b600880546001019055604080518481529051600091600160a060020a038516916000805160206137548339815191529181900360200190a3505050565b6060806060806060806060600080600080600080600c60008f600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156117b157602002820191906000526020600020905b81548152602001906001019080831161179d575b5050505050995089516040519080825280602002602001820160405280156117e3578160200160208202803883390190505b5098508951604051908082528060200260200182016040528015611811578160200160208202803883390190505b5097508951604d02604051908082528060200260200182016040528015611842578160200160208202803883390190505b50965060009550600094505b895185101561198057898581518110151561186557fe5b906020019060200201519350600d6000858152602001908152602001600020925083898681518110151561189557fe5b60209081029091010152600283015488518990879081106118b257fe5b6020908102909101015250506001810160005b815460026000196101006001841615020190911604811015611975578181815460018160011615610100020316600290048110151561190057fe5b81546001161561191f5790600052602060002090602091828204019190065b9054901a60f860020a02878780600101985081518110151561193d57fe5b7fff000000000000000000000000000000000000000000000000000000000000009092166020928302909101909101526001016118c5565b60019094019361184e565b50969c959b5093995093975050505050505050565b6000908152600d6020526040902060060154600160a060020a0316151590565b60085490565b3360009081526001602052604090205460ff161515611a24576040805160e560020a62461bcd02815260206004820152600b60248201527f6d696e696f6e5f6f6e6c79000000000000000000000000000000000000000000604482015290519081900360640190fd5b30318282011115611a7f576040805160e560020a62461bcd02815260206004820152601160248201527f6e6f7420656e6f756768206d6f6e657921000000000000000000000000000000604482015290519081900360640190fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015611ab5573d6000803e3d6000fd5b506000811115611aee57604051339082156108fc029083906000818181858888f19350505050158015611aec573d6000803e3d6000fd5b505b604080518381529051600160a060020a038516917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6000908152600d6020526040902060060154600160a060020a031690565b6060600d60008381526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110005780601f10610fd557610100808354040283529160200191611000565b62015f9081565b600160a060020a03166000908152600c602052604090205490565b600054600160a060020a03163314611c43576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b600160a060020a0381161515611ca3576040805160e560020a62461bcd02815260206004820152600360248201527f5f746f0000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600054600160a060020a0382811691161415611d09576040805160e560020a62461bcd02815260206004820152601260248201527f616c72656164795f636f6e74726f6c6c65720000000000000000000000000000604482015290519081900360640190fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f425780601f10610f1757610100808354040283529160200191610f42565b6109c481565b600080548190600160a060020a03163314611de5576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b600f546109c411611e40576040805160e560020a62461bcd02815260206004820152600c60248201527f626f756e74795f6c696d69740000000000000000000000000000000000000000604482015290519081900360640190fd5b611e9485600086868080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505060008060006020604051908101604052806000815250612f7b565b600f80546001019055604080516020810190915260008082529192506115bf9190879084906131cb565b6000611ec8613641565b6000848152600d6020908152604091829020825160e081018452815460ff168152600180830180548651600261010094831615949094026000190190911692909204601f8101869004860283018601909652858252919492938581019391929190830182828015611f7a5780601f10611f4f57610100808354040283529160200191611f7a565b820191906000526020600020905b815481529060010190602001808311611f5d57829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201548152602001600582018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050918352505060069190910154600160a060020a0390811660209092019190915260c08201519192508481169116141561207957600191506120b2565b612083848461269f565b1561209157600191506120b2565b61209f8160c0015184612c2e565b156120ad57600191506120b2565b600091505b5092915050565b600160a060020a0382163314156120cf57600080fd5b6120da338383612cb4565b5050565b6000908152600d602052604090206003015490565b33600090815260016020526040812054819060ff16151561215e576040805160e560020a62461bcd02815260206004820152600b60248201527f6d696e696f6e5f6f6e6c79000000000000000000000000000000000000000000604482015290519081900360640190fd5b600260005460a060020a900460ff16600281111561217857fe5b146121cd576040805160e560020a62461bcd02815260206004820152601160248201527f6f7065726174655f6d6f64655f6f6e6c79000000000000000000000000000000604482015290519081900360640190fd5b6121d56129bf565b151561222b576040805160e560020a62461bcd02815260206004820152600860248201527f63616e5f6d696e74000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038d16151561228b576040805160e560020a62461bcd02815260206004820152600360248201527f5f746f0000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b30318c840111156122e8576040805160e560020a62461bcd028152602060048083019190915260248201527f5f66656500000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b83151561233f576040805160e560020a62461bcd02815260206004820152600d60248201527f706172616d735f6c656e67746800000000000000000000000000000000000000604482015290519081900360640190fd5b604d8914612397576040805160e560020a62461bcd02815260206004820152600d60248201527f67656e6f6d655f6c656e67746800000000000000000000000000000000000000604482015290519081900360640190fd5b87158015906123a557508615155b156124075787871415612402576040805160e560020a62461bcd02815260206004820152600b60248201527f73616d655f706172656e74000000000000000000000000000000000000000000604482015290519081900360640190fd5b6124cb565b8715801561241457508615155b15612469576040805160e560020a62461bcd02815260206004820152600d60248201527f706172656e74415f656d70747900000000000000000000000000000000000000604482015290519081900360640190fd5b8615801561247657508715155b156124cb576040805160e560020a62461bcd02815260206004820152600d60248201527f706172656e74425f656d70747900000000000000000000000000000000000000604482015290519081900360640190fd5b61253c8d8c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843750612f7b945050505050565b905061255b60008e8360206040519081016040528060008152506131cb565b15156125b1576040805160e560020a62461bcd02815260206004820152600d60248201527f736166655f7472616e7366657200000000000000000000000000000000000000604482015290519081900360640190fd5b601060009054906101000a9004600160a060020a0316600160a060020a031663a3e76c0f8d6040518263ffffffff1660e060020a0281526004016000604051808303818588803b15801561260457600080fd5b505af1158015612618573d6000803e3d6000fd5b50505050508c600160a060020a03166000600160a060020a0316600080516020613754833981519152836040518082815260200191505060405180910390a3600083111561268f57604051339084156108fc029085906000818181858888f1935050505015801561268d573d6000803e3d6000fd5b505b9c9b505050505050505050505050565b60009182526009602052604090912054600160a060020a0391821691161490565b600054600160a060020a03163314612710576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b6000805460a060020a900460ff16600281111561272957fe5b1461277e576040805160e560020a62461bcd02815260206004820152600e60248201527f746573745f6d6f64655f6f6e6c79000000000000000000000000000000000000604482015290519081900360640190fd5b600080546001919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550565b6127b784848461114d565b6127c3848484846131cb565b151561112657600080fd5b6000848152600d60205260408120600601548590600160a060020a03163014612841576040805160e560020a62461bcd02815260206004820152600860248201527f6f776e5f6f6e6c79000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360009081526001602052604090205460ff1615156128aa576040805160e560020a62461bcd02815260206004820152600b60248201527f6d696e696f6e5f6f6e6c79000000000000000000000000000000000000000000604482015290519081900360640190fd5b8451600010612903576040805160e560020a62461bcd02815260206004820152600d60248201527f706172616d735f6c656e67746800000000000000000000000000000000000000604482015290519081900360640190fd5b6000868152600d6020908152604090912086516129289260059092019188019061368b565b506000868152600d60205260409020600201541515612956576000868152600d602052604090206002018490555b6000868152600d6020526040902060060154600160a060020a0316915061297e82888861114d565b60008311156129b657604051339084156108fc029085906000818181858888f193505050501580156129b4573d6000803e3d6000fd5b505b50505050505050565b600754600f54600e5460065401011090565b6060610c956129df83613348565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612a655780601f10612a3a57610100808354040283529160200191612a65565b820191906000526020600020905b815481529060010190602001808311612a4857829003601f168201915b505050505061345390919063ffffffff16565b600054600160a060020a03163314612ac8576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b600160005460a060020a900460ff166002811115612ae257fe5b14612b37576040805160e560020a62461bcd02815260206004820152601160248201527f70726573616c655f6d6f64655f6f6e6c79000000000000000000000000000000604482015290519081900360640190fd5b600080546002919074ff0000000000000000000000000000000000000000191660a060020a836127a5565b60075490565b600054600160a060020a03163314612bb8576040805160e560020a62461bcd02815260206004820152600f6024820152600080516020613734833981519152604482015290519081900360640190fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600160a060020a031660009081526001602052604090205460ff1690565b612c068484846000806127ce565b6127c3308585846131cb565b61140b8383836020604051908101604052806000815250612bf8565b600160a060020a039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b600e5490565b7ff0b9e5ba000000000000000000000000000000000000000000000000000000009392505050565b600f5490565b600054600160a060020a031690565b6000908152600d602052604090206004015490565b600160a060020a038381166000818152600a6020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b600081815260096020526040902054600160a060020a03161515612d45576120da565b60008181526009602090815260408083208054600160a060020a031916905580518481529051600160a060020a038616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35050565b600160a060020a0382166000908152600c602052604081205481908190612dd090600163ffffffff61359c16565b600160a060020a0386166000908152600c6020526040902080549194509084908110612df857fe5b6000918252602080832090910154600160a060020a0388168352600c82526040808420888552600b90935290922054815492945084928110612e3657fe5b6000918252602080832090910192909255600160a060020a0387168152600c90915260409020805490612e6d9060001983016136f9565b50506000838152600b6020908152604080832080549484528184209490945594825291819055600d909152919091206006018054600160a060020a03191690555050565b6000818152600d602052604081206006810154909190600160a060020a031615612f25576040805160e560020a62461bcd02815260206004820152600560248201527f74616b656e000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b50600160a060020a039092166000818152600c6020908152604080832080546001810182559084528284208101869055948352600b90915290209190915560069091018054600160a060020a0319169091179055565b600080612f86613641565b600654612f9a90600163ffffffff6135ae16565b60068190556040805160e08101825260ff8c8116825260208083018d81528385018b9052606084018d9052608084018c905260a084018a9052600060c08501819052868152600d8352949094208351815460ff19169316929092178255925180519496509194508493909261301692600185019291019061368b565b5060408201516002820155606082015160038201556080820151600482015560a0820151805161305091600584019160209091019061368b565b5060c0919091015160069091018054600160a060020a031916600160a060020a039092169190911790556130848a83612eb1565b7f870b041ec8cd071774bcc2075c786f358f51844f977acf528cb6b31f35f5719b8a86848a8a8d8a6040518088600160a060020a0316600160a060020a031681526020018781526020018681526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561311d578181015183820152602001613105565b50505050905090810190601f16801561314a5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561317d578181015183820152602001613165565b50505050905090810190601f1680156131aa5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a15098975050505050505050565b6000806131e085600160a060020a03166135bb565b15156131ef576001915061331a565b84600160a060020a031663f0b9e5ba8786866040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561326e578181015183820152602001613256565b50505050905090810190601f16801561329b5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156132bc57600080fd5b505af11580156132d0573d6000803e3d6000fd5b505050506040513d60208110156132e657600080fd5b5051600160e060020a031981167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000818152600d6020526040902060060154600160a060020a03166120da8183612da2565b606060008082818515156133915760408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152945061344a565b8593505b83156133ac57600190920191600a84049350613395565b826040519080825280601f01601f1916602001820160405280156133da578160200160208202803883390190505b5091505060001982015b851561344657815160001982019160f860020a6030600a8a06010291849190811061340b57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a860495506133e4565b8194505b50505050919050565b60608060608060008087945086935083518551016040519080825280601f01601f191660200182016040528015613494578160200160208202803883390190505b50925060009150600090505b84518110156135165784818151811015156134b757fe5b90602001015160f860020a900460f860020a0283838060010194508151811015156134de57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016134a0565b5060005b835181101561359057838181518110151561353157fe5b90602001015160f860020a900460f860020a02838380600101945081518110151561355857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060010161351a565b50909695505050505050565b6000828211156135a857fe5b50900390565b81810182811015610c9557fe5b6000903b1190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106136045782800160ff19823516178555613631565b82800160010185558215613631579182015b82811115613631578235825591602001919060010190613616565b5061363d929150613719565b5090565b60e060405190810160405280600060ff16815260200160608152602001600081526020016000815260200160008152602001606081526020016000600160a060020a031681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106136cc57805160ff1916838001178555613631565b82800160010185558215613631579182015b828111156136315782518255916020019190600101906136de565b81548183558181111561140b5760008381526020902061140b9181019083015b610f4a91905b8082111561363d576000815560010161371f5600636f6e74726f6c6c65725f6f6e6c790000000000000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820866a13716ce753d0db0a16459b318b88de83313f7b59c000bd895cf7504cf74f002900000000000000000000000094cc5746b2a0246ca844aee92a9c7f59adca25c7

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000094cc5746b2a0246ca844aee92a9c7f59adca25c7

-----Decoded View---------------
Arg [0] : _bank (address): 0x94cc5746b2A0246cA844AEe92a9c7F59adCa25c7

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000094cc5746b2a0246ca844aee92a9c7f59adca25c7


Swarm Source

bzzr://866a13716ce753d0db0a16459b318b88de83313f7b59c000bd895cf7504cf74f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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