ETH Price: $3,406.58 (-7.07%)

MetaGame (MG)
 

Overview

TokenID

112202

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:
MetaGameCore

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-21
*/

pragma solidity ^0.4.18;


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

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  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;
  }

  /**
  * @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 c;
  }

  /**
  * @dev Substracts 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) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


/**
 * @title Claimable
 * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract Claimable is Ownable {
  address public pendingOwner;

  /**
   * @dev Modifier throws if called by any account other than the pendingOwner.
   */
  modifier onlyPendingOwner() {
    require(msg.sender == pendingOwner);
    _;
  }

  /**
   * @dev Allows the current owner to set the pendingOwner address.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    pendingOwner = newOwner;
  }

  /**
   * @dev Allows the pendingOwner address to finalize the transfer.
   */
  function claimOwnership() onlyPendingOwner public {
    OwnershipTransferred(owner, pendingOwner);
    owner = pendingOwner;
    pendingOwner = address(0);
  }
}


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    Unpause();
  }
}


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
    assert(token.transfer(to, value));
  }

  function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
    assert(token.transferFrom(from, to, value));
  }

  function safeApprove(ERC20 token, address spender, uint256 value) internal {
    assert(token.approve(spender, value));
  }
}


/**
 * @title Contracts that should be able to recover tokens
 * @author SylTi
 * @dev This allow a contract to recover any ERC20 token received in a contract by transferring the balance to the contract owner.
 * This will prevent any accidental loss of tokens.
 */
contract CanReclaimToken is Ownable {
  using SafeERC20 for ERC20Basic;

  /**
   * @dev Reclaim all ERC20Basic compatible tokens
   * @param token ERC20Basic The address of the token contract
   */
  function reclaimToken(ERC20Basic token) external onlyOwner {
    uint256 balance = token.balanceOf(this);
    token.safeTransfer(owner, balance);
  }

}


/// @dev Implements access control to the DWorld contract.
contract MetaGameAccessControl is Claimable, Pausable, CanReclaimToken {
    address public cfoAddress;
    
    function MetaGameAccessControl() public {
        // The creator of the contract is the initial CFO.
        cfoAddress = msg.sender;
    }
    
    /// @dev Access modifier for CFO-only functionality.
    modifier onlyCFO() {
        require(msg.sender == cfoAddress);
        _;
    }

    /// @dev Assigns a new address to act as the CFO. Only available to the current contract owner.
    /// @param _newCFO The address of the new CFO.
    function setCFO(address _newCFO) external onlyOwner {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }
}


/// @dev Defines base data structures for DWorld.
contract MetaGameBase is MetaGameAccessControl {
    using SafeMath for uint256;
    
    mapping (uint256 => address) identifierToOwner;
    mapping (uint256 => address) identifierToApproved;
    mapping (address => uint256) ownershipDeedCount;
    
    mapping (uint256 => uint256) identifierToParentIdentifier;
    
    /// @dev All existing identifiers.
    uint256[] public identifiers;
    
    /// @notice Get all minted identifiers;
    function getAllIdentifiers() external view returns(uint256[]) {
        return identifiers;
    }
    
    /// @notice Returns the identifier of the parent of an identifier.
    /// The parent identifier is 0 if the identifier has no parent.
    /// @param identifier The identifier to get the parent identifier of.
    function parentOf(uint256 identifier) external view returns (uint256 parentIdentifier) {
        parentIdentifier = identifierToParentIdentifier[identifier];
    }
}


/// @title Interface for contracts conforming to ERC-721: Deed Standard
/// @author William Entriken (https://phor.net), et al.
/// @dev Specification at https://github.com/ethereum/EIPs/pull/841 (DRAFT)
interface ERC721 {

    // COMPLIANCE WITH ERC-165 (DRAFT) /////////////////////////////////////////

    /// @dev ERC-165 (draft) interface signature for itself
    // bytes4 internal constant INTERFACE_SIGNATURE_ERC165 = // 0x01ffc9a7
    //     bytes4(keccak256('supportsInterface(bytes4)'));

    /// @dev ERC-165 (draft) interface signature for ERC721
    // bytes4 internal constant INTERFACE_SIGNATURE_ERC721 = // 0xda671b9b
    //     bytes4(keccak256('ownerOf(uint256)')) ^
    //     bytes4(keccak256('countOfDeeds()')) ^
    //     bytes4(keccak256('countOfDeedsByOwner(address)')) ^
    //     bytes4(keccak256('deedOfOwnerByIndex(address,uint256)')) ^
    //     bytes4(keccak256('approve(address,uint256)')) ^
    //     bytes4(keccak256('takeOwnership(uint256)'));

    /// @notice Query a contract to see if it supports a certain interface
    /// @dev Returns `true` the interface is supported and `false` otherwise,
    ///  returns `true` for INTERFACE_SIGNATURE_ERC165 and
    ///  INTERFACE_SIGNATURE_ERC721, see ERC-165 for other interface signatures.
    function supportsInterface(bytes4 _interfaceID) external pure returns (bool);

    // PUBLIC QUERY FUNCTIONS //////////////////////////////////////////////////

    /// @notice Find the owner of a deed
    /// @param _deedId The identifier for a deed we are inspecting
    /// @dev Deeds assigned to zero address are considered destroyed, and
    ///  queries about them do throw.
    /// @return The non-zero address of the owner of deed `_deedId`, or `throw`
    ///  if deed `_deedId` is not tracked by this contract
    function ownerOf(uint256 _deedId) external view returns (address _owner);

    /// @notice Count deeds tracked by this contract
    /// @return A count of the deeds tracked by this contract, where each one of
    ///  them has an assigned and queryable owner
    function countOfDeeds() public view returns (uint256 _count);

    /// @notice Count all deeds assigned to an owner
    /// @dev Throws if `_owner` is the zero address, representing destroyed deeds.
    /// @param _owner An address where we are interested in deeds owned by them
    /// @return The number of deeds owned by `_owner`, possibly zero
    function countOfDeedsByOwner(address _owner) public view returns (uint256 _count);

    /// @notice Enumerate deeds assigned to an owner
    /// @dev Throws if `_index` >= `countOfDeedsByOwner(_owner)` or if
    ///  `_owner` is the zero address, representing destroyed deeds.
    /// @param _owner An address where we are interested in deeds owned by them
    /// @param _index A counter between zero and `countOfDeedsByOwner(_owner)`,
    ///  inclusive
    /// @return The identifier for the `_index`th deed assigned to `_owner`,
    ///   (sort order not specified)
    function deedOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _deedId);

    // TRANSFER MECHANISM //////////////////////////////////////////////////////

    /// @dev This event emits when ownership of any deed changes by any
    ///  mechanism. This event emits when deeds are created (`from` == 0) and
    ///  destroyed (`to` == 0). Exception: during contract creation, any
    ///  transfers may occur without emitting `Transfer`.
    event Transfer(address indexed from, address indexed to, uint256 indexed deedId);

    /// @dev This event emits on any successful call to
    ///  `approve(address _spender, uint256 _deedId)`. Exception: does not emit
    ///  if an owner revokes approval (`_to` == 0x0) on a deed with no existing
    ///  approval.
    event Approval(address indexed owner, address indexed approved, uint256 indexed deedId);

    /// @notice Approve a new owner to take your deed, or revoke approval by
    ///  setting the zero address. You may `approve` any number of times while
    ///  the deed is assigned to you, only the most recent approval matters.
    /// @dev Throws if `msg.sender` does not own deed `_deedId` or if `_to` ==
    ///  `msg.sender`.
    /// @param _deedId The deed you are granting ownership of
    function approve(address _to, uint256 _deedId) external;

    /// @notice Become owner of a deed for which you are currently approved
    /// @dev Throws if `msg.sender` is not approved to become the owner of
    ///  `deedId` or if `msg.sender` currently owns `_deedId`.
    /// @param _deedId The deed that is being transferred
    function takeOwnership(uint256 _deedId) external;
    
    // SPEC EXTENSIONS /////////////////////////////////////////////////////////
    
    /// @notice Transfer a deed to a new owner.
    /// @dev Throws if `msg.sender` does not own deed `_deedId` or if
    ///  `_to` == 0x0.
    /// @param _to The address of the new owner.
    /// @param _deedId The deed you are transferring.
    function transfer(address _to, uint256 _deedId) external;
}


/// @title Metadata extension to ERC-721 interface
/// @author William Entriken (https://phor.net)
/// @dev Specification at https://github.com/ethereum/EIPs/pull/841 (DRAFT)
interface ERC721Metadata {

    /// @dev ERC-165 (draft) interface signature for ERC721
    // bytes4 internal constant INTERFACE_SIGNATURE_ERC721Metadata = // 0x2a786f11
    //     bytes4(keccak256('name()')) ^
    //     bytes4(keccak256('symbol()')) ^
    //     bytes4(keccak256('deedUri(uint256)'));

    /// @notice A descriptive name for a collection of deeds managed by this
    ///  contract
    /// @dev Wallets and exchanges MAY display this to the end user.
    function name() public pure returns (string _deedName);

    /// @notice An abbreviated name for deeds managed by this contract
    /// @dev Wallets and exchanges MAY display this to the end user.
    function symbol() public pure returns (string _deedSymbol);

    /// @notice A distinct URI (RFC 3986) for a given token.
    /// @dev If:
    ///  * The URI is a URL
    ///  * The URL is accessible
    ///  * The URL points to a valid JSON file format (ECMA-404 2nd ed.)
    ///  * The JSON base element is an object
    ///  then these names of the base element SHALL have special meaning:
    ///  * "name": A string identifying the item to which `_deedId` grants
    ///    ownership
    ///  * "description": A string detailing the item to which `_deedId` grants
    ///    ownership
    ///  * "image": A URI pointing to a file of image/* mime type representing
    ///    the item to which `_deedId` grants ownership
    ///  Wallets and exchanges MAY display this to the end user.
    ///  Consider making any images at a width between 320 and 1080 pixels and
    ///  aspect ratio between 1.91:1 and 4:5 inclusive.
    function deedUri(uint256 _deedId) external pure returns (string _uri);
}


/// @dev Holds deed functionality such as approving and transferring. Implements ERC721.
contract MetaGameDeed is MetaGameBase, ERC721, ERC721Metadata {
    
    /// @notice Name of the collection of deeds (non-fungible token), as defined in ERC721Metadata.
    function name() public pure returns (string _deedName) {
        _deedName = "MetaGame";
    }
    
    /// @notice Symbol of the collection of deeds (non-fungible token), as defined in ERC721Metadata.
    function symbol() public pure returns (string _deedSymbol) {
        _deedSymbol = "MG";
    }
    
    /// @dev ERC-165 (draft) interface signature for itself
    bytes4 internal constant INTERFACE_SIGNATURE_ERC165 = // 0x01ffc9a7
        bytes4(keccak256('supportsInterface(bytes4)'));

    /// @dev ERC-165 (draft) interface signature for ERC721
    bytes4 internal constant INTERFACE_SIGNATURE_ERC721 = // 0xda671b9b
        bytes4(keccak256('ownerOf(uint256)')) ^
        bytes4(keccak256('countOfDeeds()')) ^
        bytes4(keccak256('countOfDeedsByOwner(address)')) ^
        bytes4(keccak256('deedOfOwnerByIndex(address,uint256)')) ^
        bytes4(keccak256('approve(address,uint256)')) ^
        bytes4(keccak256('takeOwnership(uint256)'));
        
    /// @dev ERC-165 (draft) interface signature for ERC721
    bytes4 internal constant INTERFACE_SIGNATURE_ERC721Metadata = // 0x2a786f11
        bytes4(keccak256('name()')) ^
        bytes4(keccak256('symbol()')) ^
        bytes4(keccak256('deedUri(uint256)'));
    
    /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    /// Returns true for any standardized interfaces implemented by this contract.
    /// (ERC-165 and ERC-721.)
    function supportsInterface(bytes4 _interfaceID) external pure returns (bool) {
        return (
            (_interfaceID == INTERFACE_SIGNATURE_ERC165)
            || (_interfaceID == INTERFACE_SIGNATURE_ERC721)
            || (_interfaceID == INTERFACE_SIGNATURE_ERC721Metadata)
        );
    }
    
    /// @dev Checks if a given address owns a particular deed.
    /// @param _owner The address of the owner to check for.
    /// @param _deedId The deed identifier to check for.
    function _owns(address _owner, uint256 _deedId) internal view returns (bool) {
        return identifierToOwner[_deedId] == _owner;
    }
    
    /// @dev Approve a given address to take ownership of a deed.
    /// @param _from The address approving taking ownership.
    /// @param _to The address to approve taking ownership.
    /// @param _deedId The identifier of the deed to give approval for.
    function _approve(address _from, address _to, uint256 _deedId) internal {
        identifierToApproved[_deedId] = _to;
        
        // Emit event.
        Approval(_from, _to, _deedId);
    }
    
    /// @dev Checks if a given address has approval to take ownership of a deed.
    /// @param _claimant The address of the claimant to check for.
    /// @param _deedId The identifier of the deed to check for.
    function _approvedFor(address _claimant, uint256 _deedId) internal view returns (bool) {
        return identifierToApproved[_deedId] == _claimant;
    }
    
    /// @dev Assigns ownership of a specific deed to an address.
    /// @param _from The address to transfer the deed from.
    /// @param _to The address to transfer the deed to.
    /// @param _deedId The identifier of the deed to transfer.
    function _transfer(address _from, address _to, uint256 _deedId) internal {
        // The number of deeds is capped at rows * cols, so this cannot
        // be overflowed if those parameters are sensible.
        ownershipDeedCount[_to]++;
        
        // Transfer ownership.
        identifierToOwner[_deedId] = _to;
        
        // When a new deed is minted, the _from address is 0x0, but we
        // do not track deed ownership of 0x0.
        if (_from != address(0)) {
            ownershipDeedCount[_from]--;
            
            // Clear taking ownership approval.
            delete identifierToApproved[_deedId];
        }
        
        // Emit the transfer event.
        Transfer(_from, _to, _deedId);
    }
    
    // ERC 721 implementation
    
    /// @notice Returns the total number of deeds currently in existence.
    /// @dev Required for ERC-721 compliance.
    function countOfDeeds() public view returns (uint256) {
        return identifiers.length;
    }
    
    /// @notice Returns the number of deeds owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function countOfDeedsByOwner(address _owner) public view returns (uint256) {
        return ownershipDeedCount[_owner];
    }
    
    /// @notice Returns the address currently assigned ownership of a given deed.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _deedId) external view returns (address _owner) {
        _owner = identifierToOwner[_deedId];

        require(_owner != address(0));
    }
    
    /// @notice Approve a given address to take ownership of a deed.
    /// @param _to The address to approve taking owernship.
    /// @param _deedId The identifier of the deed to give approval for.
    /// @dev Required for ERC-721 compliance.
    function approve(address _to, uint256 _deedId) external whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        approveMultiple(_to, _deedIds);
    }
    
    /// @notice Approve a given address to take ownership of multiple deeds.
    /// @param _to The address to approve taking ownership.
    /// @param _deedIds The identifiers of the deeds to give approval for.
    function approveMultiple(address _to, uint256[] _deedIds) public whenNotPaused {
        // Ensure the sender is not approving themselves.
        require(msg.sender != _to);
    
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
            
            // Require the sender is the owner of the deed.
            require(_owns(msg.sender, _deedId));
            
            // Perform the approval.
            _approve(msg.sender, _to, _deedId);
        }
    }
    
    /// @notice Transfer a deed to another address. If transferring to a smart
    /// contract be VERY CAREFUL to ensure that it is aware of ERC-721, or your
    /// deed may be lost forever.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _deedId The identifier of the deed to transfer.
    /// @dev Required for ERC-721 compliance.
    function transfer(address _to, uint256 _deedId) external whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        transferMultiple(_to, _deedIds);
    }
    
    /// @notice Transfers multiple deeds to another address. If transferring to
    /// a smart contract be VERY CAREFUL to ensure that it is aware of ERC-721,
    /// or your deeds may be lost forever.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _deedIds The identifiers of the deeds to transfer.
    function transferMultiple(address _to, uint256[] _deedIds) public whenNotPaused {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        
        // Disallow transfers to this contract to prevent accidental misuse.
        require(_to != address(this));
    
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
            
            // One can only transfer their own deeds.
            require(_owns(msg.sender, _deedId));

            // Transfer ownership
            _transfer(msg.sender, _to, _deedId);
        }
    }
    
    /// @notice Transfer a deed owned by another address, for which the calling
    /// address has previously been granted transfer approval by the owner.
    /// @param _deedId The identifier of the deed to be transferred.
    /// @dev Required for ERC-721 compliance.
    function takeOwnership(uint256 _deedId) external whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        takeOwnershipMultiple(_deedIds);
    }
    
    /// @notice Transfer multiple deeds owned by another address, for which the
    /// calling address has previously been granted transfer approval by the owner.
    /// @param _deedIds The identifier of the deed to be transferred.
    function takeOwnershipMultiple(uint256[] _deedIds) public whenNotPaused {
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
            address _from = identifierToOwner[_deedId];
            
            // Check for transfer approval
            require(_approvedFor(msg.sender, _deedId));

            // Reassign ownership (also clears pending approvals and emits Transfer event).
            _transfer(_from, msg.sender, _deedId);
        }
    }
    
    /// @notice Returns a list of all deed identifiers assigned to an address.
    /// @param _owner The owner whose deeds we are interested in.
    /// @dev This method MUST NEVER be called by smart contract code. It's very
    /// expensive and is not supported in contract-to-contract calls as it returns
    /// a dynamic array (only supported for web3 calls).
    function deedsOfOwner(address _owner) external view returns(uint256[]) {
        uint256 deedCount = countOfDeedsByOwner(_owner);

        if (deedCount == 0) {
            // Return an empty array.
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](deedCount);
            uint256 totalDeeds = countOfDeeds();
            uint256 resultIndex = 0;
            
            for (uint256 deedNumber = 0; deedNumber < totalDeeds; deedNumber++) {
                uint256 identifier = identifiers[deedNumber];
                if (identifierToOwner[identifier] == _owner) {
                    result[resultIndex] = identifier;
                    resultIndex++;
                }
            }

            return result;
        }
    }
    
    /// @notice Returns a deed identifier of the owner at the given index.
    /// @param _owner The address of the owner we want to get a deed for.
    /// @param _index The index of the deed we want.
    function deedOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        // The index should be valid.
        require(_index < countOfDeedsByOwner(_owner));

        // Loop through all deeds, accounting the number of deeds of the owner we've seen.
        uint256 seen = 0;
        uint256 totalDeeds = countOfDeeds();
        
        for (uint256 deedNumber = 0; deedNumber < totalDeeds; deedNumber++) {
            uint256 identifier = identifiers[deedNumber];
            if (identifierToOwner[identifier] == _owner) {
                if (seen == _index) {
                    return identifier;
                }
                
                seen++;
            }
        }
    }
    
    /// @notice Returns an (off-chain) metadata url for the given deed.
    /// @param _deedId The identifier of the deed to get the metadata
    /// url for.
    /// @dev Implementation of optional ERC-721 functionality.
    function deedUri(uint256 _deedId) external pure returns (string uri) {
        // Assume a maximum deed id length.
        require (_deedId < 1000000);
        
        uri = "https://meta.quazr.io/card/xxxxxxx";
        bytes memory _uri = bytes(uri);
        
        for (uint256 i = 0; i < 7; i++) {
            _uri[33 - i] = byte(48 + (_deedId / 10 ** i) % 10);
        }
    }
}


/**
 * @title PullPayment
 * @dev Base contract supporting async send for pull payments. Inherit from this
 * contract and use asyncSend instead of send.
 */
contract PullPayment {
  using SafeMath for uint256;

  mapping(address => uint256) public payments;
  uint256 public totalPayments;

  /**
  * @dev withdraw accumulated balance, called by payee.
  */
  function withdrawPayments() public {
    address payee = msg.sender;
    uint256 payment = payments[payee];

    require(payment != 0);
    require(this.balance >= payment);

    totalPayments = totalPayments.sub(payment);
    payments[payee] = 0;

    assert(payee.send(payment));
  }

  /**
  * @dev Called by the payer to store the sent amount as credit to be pulled.
  * @param dest The destination address of the funds.
  * @param amount The amount to transfer.
  */
  function asyncSend(address dest, uint256 amount) internal {
    payments[dest] = payments[dest].add(amount);
    totalPayments = totalPayments.add(amount);
  }
}


/// @dev Defines base data structures for DWorld.
contract MetaGameFinance is MetaGameDeed, PullPayment {
    /// @notice The dividend given to all parents of a deed, 
    /// in 1/1000th of a percentage.
    uint256 public dividendPercentage = 1000;
    
    /// @notice The minimum fee for the contract in 1/1000th
    /// of a percentage.
    uint256 public minimumFee = 2500;
    
    /// @notice The minimum total paid in fees and dividends.
    /// If there are (almost) no dividends to be paid, the fee
    /// for the contract is higher. This happens for deeds at
    /// or near the top of the hierarchy. In 1/1000th of a
    /// percentage.
    uint256 public minimumFeePlusDividends = 7000;
    
    // @dev A mapping from deed identifiers to the buyout price.
    mapping (uint256 => uint256) public identifierToPrice;
    
    /// @notice The threshold for a payment to be sent directly,
    /// instead of added to a beneficiary's balance.
    uint256 public directPaymentThreshold = 0 ether;
    
    /// @notice Boolean indicating whether deed price can be changed
    /// manually.
    bool public allowChangePrice = false;
    
    /// @notice The maximum depth for which dividends will be paid to parents.
    uint256 public maxDividendDepth = 6;
    
    /// @dev This event is emitted when a deed's buyout price is initially set or changed.
    event Price(uint256 indexed identifier, uint256 price, uint256 nextPrice);
    
    /// @dev This event is emitted when a deed is bought out.
    event Buy(address indexed oldOwner, address indexed newOwner, uint256 indexed identifier, uint256 price, uint256 ownerWinnings);
    
    /// @dev This event is emitted when a dividend is paid.
    event DividendPaid(address indexed beneficiary, uint256 indexed identifierBought, uint256 indexed identifier, uint256 dividend);
    
    /// @notice Set the threshold for a payment to be sent directly.
    /// @param threshold The threshold for a payment to be sent directly.
    function setDirectPaymentThreshold(uint256 threshold) external onlyCFO {
        directPaymentThreshold = threshold;
    }
    
    /// @notice Set whether prices can be changed manually.
    /// @param _allowChangePrice Bool indiciating wether prices can be changed manually.
    function setAllowChangePrice(bool _allowChangePrice) external onlyCFO {
        allowChangePrice = _allowChangePrice;
    }
    
    /// @notice Set the maximum dividend depth.
    /// @param _maxDividendDepth The maximum dividend depth.
    function setMaxDividendDepth(uint256 _maxDividendDepth) external onlyCFO {
        maxDividendDepth = _maxDividendDepth;
    }
    
    /// @notice Calculate the next price given the current price.
    /// @param currentPrice The current price.
    function nextPrice(uint256 currentPrice) public pure returns(uint256) {
        if (currentPrice < 1 ether) {
            return currentPrice.mul(200).div(100); // 100% increase
        } else if (currentPrice < 5 ether) {
            return currentPrice.mul(150).div(100); // 50% increase
        } else {
            return currentPrice.mul(135).div(100); // 35% increase
        }
    }
    
    /// @notice Set the price of a deed.
    /// @param identifier The identifier of the deed to change the price of.
    /// @param newPrice The new price of the deed.
    function changeDeedPrice(uint256 identifier, uint256 newPrice) public {
        // The message sender must be the deed owner.
        require(identifierToOwner[identifier] == msg.sender);
        
        // Price changes must be enabled.
        require(allowChangePrice);
        
        // The new price must be lower than the current price.
        require(newPrice < identifierToPrice[identifier]);
        
        // Set the new price.
        identifierToPrice[identifier] = newPrice;
        Price(identifier, newPrice, nextPrice(newPrice));
    }
    
    /// @notice Set the initial price of a deed.
    /// @param identifier The identifier of the deed to change the price of.
    /// @param newPrice The new price of the deed.
    function changeInitialPrice(uint256 identifier, uint256 newPrice) public onlyCFO {        
        // The deed must be owned by the contract.
        require(identifierToOwner[identifier] == address(this));
        
        // Set the new price.
        identifierToPrice[identifier] = newPrice;
        Price(identifier, newPrice, nextPrice(newPrice));
    }
    
    /// @dev Pay dividends to parents of a deed.
    /// @param identifierBought The identifier of the deed that was bought.
    /// @param identifier The identifier of the deed to pay its parents dividends for (recursed).
    /// @param dividend The dividend to be paid to parents of the deed.
    /// @param depth The depth of this dividend.
    function _payDividends(uint256 identifierBought, uint256 identifier, uint256 dividend, uint256 depth)
        internal
        returns(uint256 totalDividendsPaid)
    {
        uint256 parentIdentifier = identifierToParentIdentifier[identifier];
        
        if (parentIdentifier != 0 && depth < maxDividendDepth) {
            address parentOwner = identifierToOwner[parentIdentifier];
        
            if (parentOwner != address(this)) {            
                // Send dividend to the owner of the parent.
                _sendFunds(parentOwner, dividend);
                DividendPaid(parentOwner, identifierBought, parentIdentifier, dividend);
            }
            
            totalDividendsPaid = dividend;
        
            // Recursively pay dividends to parents of parents.
            uint256 dividendsPaid = _payDividends(identifierBought, parentIdentifier, dividend, depth + 1);
            
            totalDividendsPaid = totalDividendsPaid.add(dividendsPaid);
        } else {
            // Not strictly necessary to set this to 0 explicitly... but makes
            // it clearer to see what happens.
            totalDividendsPaid = 0;
        }
    }
    
    /// @dev Calculate the contract fee.
    /// @param price The price of the buyout.
    /// @param dividendsPaid The total amount paid in dividends.
    function calculateFee(uint256 price, uint256 dividendsPaid) public view returns(uint256 fee) {
        // Calculate the absolute minimum fee.
        fee = price.mul(minimumFee).div(100000);
        
        // Calculate the minimum fee plus dividends payable.
        // See also the explanation at the definition of
        // minimumFeePlusDividends.
        uint256 _minimumFeePlusDividends = price.mul(minimumFeePlusDividends).div(100000);
        
        if (_minimumFeePlusDividends > dividendsPaid) {
            uint256 feeMinusDividends = _minimumFeePlusDividends.sub(dividendsPaid);
        
            // The minimum total paid in 'fees plus dividends', minus dividends, is
            // greater than the minimum fee. Set the fee to this value.
            if (feeMinusDividends > fee) {
                fee = feeMinusDividends;
            }
        }
    }
    
    /// @dev Send funds to a beneficiary. If sending fails, assign
    /// funds to the beneficiary's balance for manual withdrawal.
    /// @param beneficiary The beneficiary's address to send funds to
    /// @param amount The amount to send.
    function _sendFunds(address beneficiary, uint256 amount) internal {
        if (amount < directPaymentThreshold) {
            // Amount is under send threshold. Send funds asynchronously
            // for manual withdrawal by the beneficiary.
            asyncSend(beneficiary, amount);
        } else if (!beneficiary.send(amount)) {
            // Failed to send funds. This can happen due to a failure in
            // fallback code of the beneficiary, or because of callstack
            // depth.
            // Send funds asynchronously for manual withdrawal by the
            // beneficiary.
            asyncSend(beneficiary, amount);
        }
    }
    
    /// @notice Withdraw (unowed) contract balance.
    function withdrawFreeBalance() external onlyCFO {
        // Calculate the free (unowed) balance. This never underflows, as
        // totalPayments is guaranteed to be less than or equal to the
        // contract balance.
        uint256 freeBalance = this.balance - totalPayments;
        
        cfoAddress.transfer(freeBalance);
    }
}


/// @dev Defines core meta game functionality.
contract MetaGameCore is MetaGameFinance {
    
    function MetaGameCore() public {
        // Start the contract paused.
        paused = true;
    }
    
    /// @notice Create a collectible.
    /// @param identifier The identifier of the collectible that is to be created.
    /// @param owner The address of the initial owner. Blank if this contract should
    /// be the initial owner.
    /// @param parentIdentifier The identifier of the parent of the collectible, which
    /// receives dividends when this collectible trades.
    /// @param price The initial price of the collectible.
    function createCollectible(uint256 identifier, address owner, uint256 parentIdentifier, uint256 price) external onlyCFO {
        // The identifier must be valid. Identifier 0 is reserved
        // to mark a collectible as having no parent.
        require(identifier >= 1);
    
        // The identifier must not exist yet.
        require(identifierToOwner[identifier] == 0x0);
        
        // Add the identifier to the list of existing identifiers.
        identifiers.push(identifier);
        
        address initialOwner = owner;
        
        if (initialOwner == 0x0) {
            // Set the initial owner to be the contract itself.
            initialOwner = address(this);
        }
        
        // Transfer the collectible to the initial owner.
        _transfer(0x0, initialOwner, identifier);
        
        // Set the parent identifier.
        identifierToParentIdentifier[identifier] = parentIdentifier;
        
        // Set the initial price.
        identifierToPrice[identifier] = price;
        
        // Emit price event.
        Price(identifier, price, nextPrice(price));
    }
    
    /// @notice Set the parent collectible of a collectible.
    function setParent(uint256 identifier, uint256 parentIdentifier) external onlyCFO {
        // The deed must exist.
        require(identifierToOwner[identifier] != 0x0);
        
        identifierToParentIdentifier[identifier] = parentIdentifier;
    }
    
    /// @notice Buy a collectible.
    function buy(uint256 identifier) external payable whenNotPaused {
        // The collectible must exist.
        require(identifierToOwner[identifier] != 0x0);
        
        address oldOwner = identifierToOwner[identifier];
        uint256 price = identifierToPrice[identifier];
        
        // The old owner must not be the same as the buyer.
        require(oldOwner != msg.sender);
        
        // Enough ether must be provided.
        require(msg.value >= price);
        
        // Set the new price.
        uint256 newPrice = nextPrice(price);
        identifierToPrice[identifier] = newPrice;
        
        // Transfer the collectible.
        _transfer(oldOwner, msg.sender, identifier);
        
        // Emit price change event.
        Price(identifier, newPrice, nextPrice(newPrice));
        
        // Pay dividends.
        uint256 dividend = price.mul(dividendPercentage).div(100000);
        uint256 dividendsPaid = _payDividends(identifier, identifier, dividend, 0);
        
        // Calculate the contract fee.
        uint256 fee = calculateFee(price, dividendsPaid);
        
        // Calculate the winnings for the previous owner.
        uint256 oldOwnerWinnings = price.sub(dividendsPaid).sub(fee);
        
        // Emit buy event.
        Buy(oldOwner, msg.sender, identifier, price, oldOwnerWinnings);
        
        if (oldOwner != address(this)) {
            // The old owner is not this contract itself.
            // Pay the old owner.
            _sendFunds(oldOwner, oldOwnerWinnings);
        }
        
        // Calculate overspent ether. This cannot underflow, as the require
        // guarantees price to be greater than or equal to msg.value.
        uint256 excess = price - msg.value;
        
        if (excess > 0) {
            // Refund overspent Ether.
            msg.sender.transfer(excess);
        }
    }
    
    /// @notice Return a collectible's details.
    /// @param identifier The identifier of the collectible to get details for.
    function getDeed(uint256 identifier)
        external
        view
        returns(uint256 deedId, address owner, uint256 buyPrice, uint256 nextBuyPrice)
    {
        deedId = identifier;
        owner = identifierToOwner[identifier];
        buyPrice = identifierToPrice[identifier];
        nextBuyPrice = nextPrice(buyPrice);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"totalPayments","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":"pure","type":"function"},{"constant":true,"inputs":[],"name":"minimumFeePlusDividends","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_deedName","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"identifier","type":"uint256"},{"name":"newPrice","type":"uint256"}],"name":"changeInitialPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"reclaimToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minimumFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"identifier","type":"uint256"},{"name":"owner","type":"address"},{"name":"parentIdentifier","type":"uint256"},{"name":"price","type":"uint256"}],"name":"createCollectible","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedIds","type":"uint256[]"}],"name":"transferMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedIds","type":"uint256[]"}],"name":"approveMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"threshold","type":"uint256"}],"name":"setDirectPaymentThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"identifier","type":"uint256"},{"name":"parentIdentifier","type":"uint256"}],"name":"setParent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"currentPrice","type":"uint256"}],"name":"nextPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"identifiers","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"deedsOfOwner","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"price","type":"uint256"},{"name":"dividendsPaid","type":"uint256"}],"name":"calculateFee","outputs":[{"name":"fee","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxDividendDepth","type":"uint256"}],"name":"setMaxDividendDepth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"deedOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllIdentifiers","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawPayments","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"identifier","type":"uint256"}],"name":"getDeed","outputs":[{"name":"deedId","type":"uint256"},{"name":"owner","type":"address"},{"name":"buyPrice","type":"uint256"},{"name":"nextBuyPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dividendPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxDividendDepth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"directPaymentThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countOfDeedsByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_deedSymbol","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"identifierToPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"identifier","type":"uint256"},{"name":"newPrice","type":"uint256"}],"name":"changeDeedPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allowChangePrice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_allowChangePrice","type":"bool"}],"name":"setAllowChangePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"deedUri","outputs":[{"name":"uri","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"countOfDeeds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"identifier","type":"uint256"}],"name":"parentOf","outputs":[{"name":"parentIdentifier","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"identifier","type":"uint256"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"payments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deedIds","type":"uint256[]"}],"name":"takeOwnershipMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawFreeBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"identifier","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"nextPrice","type":"uint256"}],"name":"Price","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"},{"indexed":true,"name":"identifier","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"ownerWinnings","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":true,"name":"identifierBought","type":"uint256"},{"indexed":true,"name":"identifier","type":"uint256"},{"indexed":false,"name":"dividend","type":"uint256"}],"name":"DividendPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"deedId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"deedId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526001805460a060020a60ff02191690556103e8600a556109c4600b55611b58600c556000600e55600f805460ff191690556006601055341561004557600080fd5b60008054600160a060020a033316600160a060020a031991821681179092556002805490911690911790556001805460a060020a60ff021916740100000000000000000000000000000000000000001790556120dc806100a66000396000f3006060604052600436106102415763ffffffff60e060020a6000350416625b4487811461024657806301ffc9a71461026b57806303d0b7d2146102b75780630519ce79146102ca57806306fdde03146102f9578063095ea7b31461038357806317a87b80146103a757806317ffc320146103c05780631a7626e7146103df5780631affcd7e146103f25780631d976e051461041a5780631f5c3a3c146104775780632062e457146104d4578063223e97be146104ea5780632821ca711461050357806328f2d4da146105195780632d620e1e1461052f57806334e73122146105a15780633f4ba83a146105ba5780634e0a3379146105cd5780634e71e0c8146105ec5780634fd81926146105ff57806353270910146106155780635c975abb146106375780635de3ba971461064a5780636103d70b1461065d5780636352211e14610670578063683ad727146106865780636bb80d51146106d05780638456cb59146106e35780638b018bca146106f65780638da5cb5b1461070957806390b17f991461071c57806392efd2771461072f57806395d89b411461074e5780639eb180a714610761578063a132e33614610777578063a25287c514610790578063a9059cbb146107a3578063aa601a71146107c5578063b2e6ceeb146107dd578063b95d2a53146107f3578063c34588ba14610809578063cfa3c1321461081c578063d96a094a14610832578063e2982c211461083d578063e30c39781461085c578063e435f2c91461086f578063ee8b39f6146108be578063f2fde38b146108d1575b600080fd5b341561025157600080fd5b6102596108f0565b60405190815260200160405180910390f35b341561027657600080fd5b6102a37fffffffff00000000000000000000000000000000000000000000000000000000600435166108f6565b604051901515815260200160405180910390f35b34156102c257600080fd5b610259610b67565b34156102d557600080fd5b6102dd610b6d565b604051600160a060020a03909116815260200160405180910390f35b341561030457600080fd5b61030c610b7c565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610348578082015183820152602001610330565b50505050905090810190601f1680156103755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561038e57600080fd5b6103a5600160a060020a0360043516602435610bbd565b005b34156103b257600080fd5b6103a5600435602435610c25565b34156103cb57600080fd5b6103a5600160a060020a0360043516610cbf565b34156103ea57600080fd5b610259610d73565b34156103fd57600080fd5b6103a5600435600160a060020a0360243516604435606435610d79565b341561042557600080fd5b6103a560048035600160a060020a0316906044602480359081019083013580602080820201604051908101604052809392919081815260200183836020028082843750949650610e7195505050505050565b341561048257600080fd5b6103a560048035600160a060020a0316906044602480359081019083013580602080820201604051908101604052809392919081815260200183836020028082843750949650610f1a95505050505050565b34156104df57600080fd5b6103a5600435610fa8565b34156104f557600080fd5b6103a5600435602435610fc8565b341561050e57600080fd5b610259600435611018565b341561052457600080fd5b61025960043561108f565b341561053a57600080fd5b61054e600160a060020a03600435166110ae565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561058d578082015183820152602001610575565b505050509050019250505060405180910390f35b34156105ac57600080fd5b6102596004356024356111b4565b34156105c557600080fd5b6103a5611223565b34156105d857600080fd5b6103a5600160a060020a03600435166112a2565b34156105f757600080fd5b6103a56112f4565b341561060a57600080fd5b6103a5600435611375565b341561062057600080fd5b610259600160a060020a0360043516602435611395565b341561064257600080fd5b6102a3611439565b341561065557600080fd5b61054e611449565b341561066857600080fd5b6103a56114a8565b341561067b57600080fd5b6102dd60043561153d565b341561069157600080fd5b61069c600435611561565b604051938452600160a060020a03909216602084015260408084019190915260608301919091526080909101905180910390f35b34156106db57600080fd5b61025961159b565b34156106ee57600080fd5b6103a56115a1565b341561070157600080fd5b610259611625565b341561071457600080fd5b6102dd61162b565b341561072757600080fd5b61025961163a565b341561073a57600080fd5b610259600160a060020a0360043516611640565b341561075957600080fd5b61030c61165b565b341561076c57600080fd5b61025960043561169c565b341561078257600080fd5b6103a56004356024356116ae565b341561079b57600080fd5b6102a3611700565b34156107ae57600080fd5b6103a5600160a060020a0360043516602435611709565b34156107d057600080fd5b6103a5600435151561176c565b34156107e857600080fd5b6103a560043561179a565b34156107fe57600080fd5b61030c6004356117fc565b341561081457600080fd5b61025961191b565b341561082757600080fd5b610259600435611921565b6103a5600435611933565b341561084857600080fd5b610259600160a060020a0360043516611b45565b341561086757600080fd5b6102dd611b57565b341561087a57600080fd5b6103a56004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650611b6695505050505050565b34156108c957600080fd5b6103a5611bf0565b34156108dc57600080fd5b6103a5600160a060020a0360043516611c51565b60095481565b60006040517f737570706f727473496e7465726661636528627974657334290000000000000081526019016040518091039020600160e060020a03191682600160e060020a0319161480610aad57506040517f74616b654f776e6572736869702875696e743235362900000000000000000000815260160160405180910390206040517f617070726f766528616464726573732c75696e74323536290000000000000000815260180160405180910390206040517f646565644f664f776e65724279496e64657828616464726573732c75696e743281527f3536290000000000000000000000000000000000000000000000000000000000602082015260230160405180910390206040517f636f756e744f66446565647342794f776e6572286164647265737329000000008152601c0160405180910390206040517f636f756e744f66446565647328290000000000000000000000000000000000008152600e0160405180910390206040517f6f776e65724f662875696e743235362900000000000000000000000000000000815260100160405180910390201818181818600160e060020a03191682600160e060020a031916145b80610b5f57506040517f646565645572692875696e743235362900000000000000000000000000000000815260100160405180910390206040517f73796d626f6c2829000000000000000000000000000000000000000000000000815260080160405180910390206040517f6e616d6528290000000000000000000000000000000000000000000000000000815260060160405180910390201818600160e060020a03191682600160e060020a031916145b90505b919050565b600c5481565b600254600160a060020a031681565b610b84612061565b60408051908101604052600881527f4d65746147616d650000000000000000000000000000000000000000000000006020820152919050565b610bc5612061565b60015460a060020a900460ff1615610bdc57600080fd5b6001604051805910610beb5750595b908082528060200260200182016040525090508181600081518110610c0c57fe5b60209081029091010152610c208382610f1a565b505050565b60025433600160a060020a03908116911614610c4057600080fd5b60008281526003602052604090205430600160a060020a03908116911614610c6757600080fd5b6000828152600d60205260409020819055817f4afcb4a87cdbd9974efdb92ee48bc8d7cd0ae4bf217004db3d080cbaee652ca782610ca481611018565b60405191825260208201526040908101905180910390a25050565b6000805433600160a060020a03908116911614610cdb57600080fd5b81600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610d3257600080fd5b6102c65a03f11515610d4357600080fd5b5050506040518051600054909250610d6f9150600160a060020a0384811691168363ffffffff611c8e16565b5050565b600b5481565b60025460009033600160a060020a03908116911614610d9757600080fd5b6001851015610da557600080fd5b600085815260036020526040902054600160a060020a031615610dc757600080fd5b6007805460018101610dd98382612073565b5060009182526020909120018590555082600160a060020a0381161515610dfd5750305b610e0960008287611d0e565b6000858152600660209081526040808320869055600d9091529020829055847f4afcb4a87cdbd9974efdb92ee48bc8d7cd0ae4bf217004db3d080cbaee652ca783610e5381611018565b60405191825260208201526040908101905180910390a25050505050565b600154600090819060a060020a900460ff1615610e8d57600080fd5b600160a060020a0384161515610ea257600080fd5b30600160a060020a031684600160a060020a031614151515610ec357600080fd5b600091505b8251821015610f1457828281518110610edd57fe5b906020019060200201519050610ef33382611dd5565b1515610efe57600080fd5b610f09338583611d0e565b600190910190610ec8565b50505050565b600154600090819060a060020a900460ff1615610f3657600080fd5b83600160a060020a031633600160a060020a031614151515610f5757600080fd5b600091505b8251821015610f1457828281518110610f7157fe5b906020019060200201519050610f873382611dd5565b1515610f9257600080fd5b610f9d338583611df5565b600190910190610f5c565b60025433600160a060020a03908116911614610fc357600080fd5b600e55565b60025433600160a060020a03908116911614610fe357600080fd5b600082815260036020526040902054600160a060020a0316151561100657600080fd5b60009182526006602052604090912055565b6000670de0b6b3a76400008210156110535761104c60646110408460c863ffffffff611e5916565b9063ffffffff611e8f16565b9050610b62565b674563918244f400008210156110795761104c606461104084609663ffffffff611e5916565b61104c606461104084608763ffffffff611e5916565b600780548290811061109d57fe5b600091825260209091200154905081565b6110b6612061565b60006110c0612061565b6000806000806110cf88611640565b95508515156110ff5760006040518059106110e75750595b908082528060200260200182016040525096506111a9565b8560405180591061110d5750595b9080825280602002602001820160405250945061112861191b565b935060009250600091505b838210156111a557600780548390811061114957fe5b60009182526020808320909101548083526003909152604090912054909150600160a060020a03908116908916141561119a578085848151811061118957fe5b602090810290910101526001909201915b600190910190611133565b8496505b505050505050919050565b60008060006111d5620186a0611040600b5488611e5990919063ffffffff16565b92506111f3620186a0611040600c5488611e5990919063ffffffff16565b91508382111561121b5761120d828563ffffffff611ea616565b90508281111561121b578092505b505092915050565b60005433600160a060020a0390811691161461123e57600080fd5b60015460a060020a900460ff16151561125657600080fd5b6001805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60005433600160a060020a039081169116146112bd57600080fd5b600160a060020a03811615156112d257600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461130f57600080fd5b600154600054600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60025433600160a060020a0390811691161461139057600080fd5b601055565b60008060008060006113a687611640565b86106113b157600080fd5b600093506113bd61191b565b9250600091505b8282101561142f5760078054839081106113da57fe5b60009182526020808320909101548083526003909152604090912054909150600160a060020a039081169088161415611424578584141561141d5780945061142f565b6001909301925b6001909101906113c4565b5050505092915050565b60015460a060020a900460ff1681565b611451612061565b600780548060200260200160405190810160405280929190818152602001828054801561149d57602002820191906000526020600020905b815481526020019060010190808311611489575b505050505090505b90565b33600160a060020a0381166000908152600860205260409020548015156114ce57600080fd5b600160a060020a03301631819010156114e657600080fd5b6009546114f9908263ffffffff611ea616565b600955600160a060020a0382166000818152600860205260408082209190915582156108fc0290839051600060405180830381858888f193505050501515610d6f57fe5b600081815260036020526040902054600160a060020a0316801515610b6257600080fd5b600081815260036020908152604080832054600d9092528220548392600160a060020a039092169161159282611018565b90509193509193565b600a5481565b60005433600160a060020a039081169116146115bc57600080fd5b60015460a060020a900460ff16156115d357600080fd5b6001805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60105481565b600054600160a060020a031681565b600e5481565b600160a060020a031660009081526005602052604090205490565b611663612061565b60408051908101604052600281527f4d470000000000000000000000000000000000000000000000000000000000006020820152919050565b600d6020526000908152604090205481565b60008281526003602052604090205433600160a060020a039081169116146116d557600080fd5b600f5460ff1615156116e657600080fd5b6000828152600d60205260409020548110610c6757600080fd5b600f5460ff1681565b611711612061565b60015460a060020a900460ff161561172857600080fd5b60016040518059106117375750595b90808252806020026020018201604052509050818160008151811061175857fe5b60209081029091010152610c208382610e71565b60025433600160a060020a0390811691161461178757600080fd5b600f805460ff1916911515919091179055565b6117a2612061565b60015460a060020a900460ff16156117b957600080fd5b60016040518059106117c85750595b9080825280602002602001820160405250905081816000815181106117e957fe5b60209081029091010152610d6f81611b66565b611804612061565b61180c612061565b6000620f4240841061181d57600080fd5b606060405190810160405280602281526020017f68747470733a2f2f6d6574612e7175617a722e696f2f636172642f787878787881526020017f78780000000000000000000000000000000000000000000000000000000000008152509250829150600090505b600781101561191457600a81600a0a8581151561189d57fe5b048115156118a757fe5b066030017f0100000000000000000000000000000000000000000000000000000000000000028282602103815181106118dc57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611884565b5050919050565b60075490565b60009081526006602052604090205490565b600080600080600080600080600160149054906101000a900460ff1615151561195b57600080fd5b600089815260036020526040902054600160a060020a0316151561197e57600080fd5b600089815260036020908152604080832054600d90925290912054600160a060020a039182169950975033168814156119b657600080fd5b34879010156119c457600080fd5b6119cd87611018565b60008a8152600d6020526040902081905595506119eb88338b611d0e565b887f4afcb4a87cdbd9974efdb92ee48bc8d7cd0ae4bf217004db3d080cbaee652ca787611a1789611018565b60405191825260208201526040908101905180910390a2611a4a620186a0611040600a548a611e5990919063ffffffff16565b9450611a59898a876000611eb8565b9350611a6587856111b4565b9250611a8783611a7b898763ffffffff611ea616565b9063ffffffff611ea616565b91508833600160a060020a031689600160a060020a03167ef93dbdb72854b6b6fb35433086556f2635fc83c37080c667496fecfa650fb48a8660405191825260208201526040908101905180910390a430600160a060020a031688600160a060020a0316141515611afc57611afc8883611f87565b503486036000811115611b3a57600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515611b3a57600080fd5b505050505050505050565b60086020526000908152604090205481565b600154600160a060020a031681565b6001546000908190819060a060020a900460ff1615611b8457600080fd5b600092505b8351831015610f1457838381518110611b9e57fe5b90602001906020020151600081815260036020526040902054909250600160a060020a03169050611bcf3383611fd6565b1515611bda57600080fd5b611be5813384611d0e565b600190920191611b89565b60025460009033600160a060020a03908116911614611c0e57600080fd5b50600954600254600160a060020a033081163192909203911681156108fc0282604051600060405180830381858888f193505050501515611c4e57600080fd5b50565b60005433600160a060020a03908116911614611c6c57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611ceb57600080fd5b6102c65a03f11515611cfc57600080fd5b505050604051805190501515610c2057fe5b600160a060020a03808316600081815260056020908152604080832080546001019055858352600390915290208054600160a060020a0319169091179055831615611d8f57600160a060020a03831660009081526005602090815260408083208054600019019055838352600490915290208054600160a060020a03191690555b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600090815260036020526040902054600160a060020a0391821691161490565b600081815260046020526040908190208054600160a060020a031916600160a060020a03858116918217909255839290918616907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925905160405180910390a4505050565b600080831515611e6c5760009150611e88565b50828202828482811515611e7c57fe5b0414611e8457fe5b8091505b5092915050565b6000808284811515611e9d57fe5b04949350505050565b600082821115611eb257fe5b50900390565b60008381526006602052604081205481808215801590611ed9575060105485105b15611f7757600083815260036020526040902054600160a060020a03908116925030168214611f4c57611f0c8287611f87565b828883600160a060020a03167f7875bbe2cfc0c5746093cb37f9404afd9499851458db1f5f0d33475e291dd92c8960405190815260200160405180910390a45b859350611f5e88848888600101611eb8565b9050611f70848263ffffffff611ff616565b9350611f7c565b600093505b505050949350505050565b600e54811015611fa057611f9b8282612005565b610d6f565b600160a060020a03821681156108fc0282604051600060405180830381858888f193505050501515610d6f57610d6f8282612005565b600090815260046020526040902054600160a060020a0391821691161490565b600082820183811015611e8457fe5b600160a060020a03821660009081526008602052604090205461202e908263ffffffff611ff616565b600160a060020a03831660009081526008602052604090205560095461205a908263ffffffff611ff616565b6009555050565b60206040519081016040526000815290565b815481835581811511610c2057600083815260209020610c209181019083016114a591905b808211156120ac5760008155600101612098565b50905600a165627a7a72305820d84796e39bf686ffaa43abe670fb5cf53f51c78fe205ba330f08096404a8b54e0029

Deployed Bytecode

0x6060604052600436106102415763ffffffff60e060020a6000350416625b4487811461024657806301ffc9a71461026b57806303d0b7d2146102b75780630519ce79146102ca57806306fdde03146102f9578063095ea7b31461038357806317a87b80146103a757806317ffc320146103c05780631a7626e7146103df5780631affcd7e146103f25780631d976e051461041a5780631f5c3a3c146104775780632062e457146104d4578063223e97be146104ea5780632821ca711461050357806328f2d4da146105195780632d620e1e1461052f57806334e73122146105a15780633f4ba83a146105ba5780634e0a3379146105cd5780634e71e0c8146105ec5780634fd81926146105ff57806353270910146106155780635c975abb146106375780635de3ba971461064a5780636103d70b1461065d5780636352211e14610670578063683ad727146106865780636bb80d51146106d05780638456cb59146106e35780638b018bca146106f65780638da5cb5b1461070957806390b17f991461071c57806392efd2771461072f57806395d89b411461074e5780639eb180a714610761578063a132e33614610777578063a25287c514610790578063a9059cbb146107a3578063aa601a71146107c5578063b2e6ceeb146107dd578063b95d2a53146107f3578063c34588ba14610809578063cfa3c1321461081c578063d96a094a14610832578063e2982c211461083d578063e30c39781461085c578063e435f2c91461086f578063ee8b39f6146108be578063f2fde38b146108d1575b600080fd5b341561025157600080fd5b6102596108f0565b60405190815260200160405180910390f35b341561027657600080fd5b6102a37fffffffff00000000000000000000000000000000000000000000000000000000600435166108f6565b604051901515815260200160405180910390f35b34156102c257600080fd5b610259610b67565b34156102d557600080fd5b6102dd610b6d565b604051600160a060020a03909116815260200160405180910390f35b341561030457600080fd5b61030c610b7c565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610348578082015183820152602001610330565b50505050905090810190601f1680156103755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561038e57600080fd5b6103a5600160a060020a0360043516602435610bbd565b005b34156103b257600080fd5b6103a5600435602435610c25565b34156103cb57600080fd5b6103a5600160a060020a0360043516610cbf565b34156103ea57600080fd5b610259610d73565b34156103fd57600080fd5b6103a5600435600160a060020a0360243516604435606435610d79565b341561042557600080fd5b6103a560048035600160a060020a0316906044602480359081019083013580602080820201604051908101604052809392919081815260200183836020028082843750949650610e7195505050505050565b341561048257600080fd5b6103a560048035600160a060020a0316906044602480359081019083013580602080820201604051908101604052809392919081815260200183836020028082843750949650610f1a95505050505050565b34156104df57600080fd5b6103a5600435610fa8565b34156104f557600080fd5b6103a5600435602435610fc8565b341561050e57600080fd5b610259600435611018565b341561052457600080fd5b61025960043561108f565b341561053a57600080fd5b61054e600160a060020a03600435166110ae565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561058d578082015183820152602001610575565b505050509050019250505060405180910390f35b34156105ac57600080fd5b6102596004356024356111b4565b34156105c557600080fd5b6103a5611223565b34156105d857600080fd5b6103a5600160a060020a03600435166112a2565b34156105f757600080fd5b6103a56112f4565b341561060a57600080fd5b6103a5600435611375565b341561062057600080fd5b610259600160a060020a0360043516602435611395565b341561064257600080fd5b6102a3611439565b341561065557600080fd5b61054e611449565b341561066857600080fd5b6103a56114a8565b341561067b57600080fd5b6102dd60043561153d565b341561069157600080fd5b61069c600435611561565b604051938452600160a060020a03909216602084015260408084019190915260608301919091526080909101905180910390f35b34156106db57600080fd5b61025961159b565b34156106ee57600080fd5b6103a56115a1565b341561070157600080fd5b610259611625565b341561071457600080fd5b6102dd61162b565b341561072757600080fd5b61025961163a565b341561073a57600080fd5b610259600160a060020a0360043516611640565b341561075957600080fd5b61030c61165b565b341561076c57600080fd5b61025960043561169c565b341561078257600080fd5b6103a56004356024356116ae565b341561079b57600080fd5b6102a3611700565b34156107ae57600080fd5b6103a5600160a060020a0360043516602435611709565b34156107d057600080fd5b6103a5600435151561176c565b34156107e857600080fd5b6103a560043561179a565b34156107fe57600080fd5b61030c6004356117fc565b341561081457600080fd5b61025961191b565b341561082757600080fd5b610259600435611921565b6103a5600435611933565b341561084857600080fd5b610259600160a060020a0360043516611b45565b341561086757600080fd5b6102dd611b57565b341561087a57600080fd5b6103a56004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650611b6695505050505050565b34156108c957600080fd5b6103a5611bf0565b34156108dc57600080fd5b6103a5600160a060020a0360043516611c51565b60095481565b60006040517f737570706f727473496e7465726661636528627974657334290000000000000081526019016040518091039020600160e060020a03191682600160e060020a0319161480610aad57506040517f74616b654f776e6572736869702875696e743235362900000000000000000000815260160160405180910390206040517f617070726f766528616464726573732c75696e74323536290000000000000000815260180160405180910390206040517f646565644f664f776e65724279496e64657828616464726573732c75696e743281527f3536290000000000000000000000000000000000000000000000000000000000602082015260230160405180910390206040517f636f756e744f66446565647342794f776e6572286164647265737329000000008152601c0160405180910390206040517f636f756e744f66446565647328290000000000000000000000000000000000008152600e0160405180910390206040517f6f776e65724f662875696e743235362900000000000000000000000000000000815260100160405180910390201818181818600160e060020a03191682600160e060020a031916145b80610b5f57506040517f646565645572692875696e743235362900000000000000000000000000000000815260100160405180910390206040517f73796d626f6c2829000000000000000000000000000000000000000000000000815260080160405180910390206040517f6e616d6528290000000000000000000000000000000000000000000000000000815260060160405180910390201818600160e060020a03191682600160e060020a031916145b90505b919050565b600c5481565b600254600160a060020a031681565b610b84612061565b60408051908101604052600881527f4d65746147616d650000000000000000000000000000000000000000000000006020820152919050565b610bc5612061565b60015460a060020a900460ff1615610bdc57600080fd5b6001604051805910610beb5750595b908082528060200260200182016040525090508181600081518110610c0c57fe5b60209081029091010152610c208382610f1a565b505050565b60025433600160a060020a03908116911614610c4057600080fd5b60008281526003602052604090205430600160a060020a03908116911614610c6757600080fd5b6000828152600d60205260409020819055817f4afcb4a87cdbd9974efdb92ee48bc8d7cd0ae4bf217004db3d080cbaee652ca782610ca481611018565b60405191825260208201526040908101905180910390a25050565b6000805433600160a060020a03908116911614610cdb57600080fd5b81600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610d3257600080fd5b6102c65a03f11515610d4357600080fd5b5050506040518051600054909250610d6f9150600160a060020a0384811691168363ffffffff611c8e16565b5050565b600b5481565b60025460009033600160a060020a03908116911614610d9757600080fd5b6001851015610da557600080fd5b600085815260036020526040902054600160a060020a031615610dc757600080fd5b6007805460018101610dd98382612073565b5060009182526020909120018590555082600160a060020a0381161515610dfd5750305b610e0960008287611d0e565b6000858152600660209081526040808320869055600d9091529020829055847f4afcb4a87cdbd9974efdb92ee48bc8d7cd0ae4bf217004db3d080cbaee652ca783610e5381611018565b60405191825260208201526040908101905180910390a25050505050565b600154600090819060a060020a900460ff1615610e8d57600080fd5b600160a060020a0384161515610ea257600080fd5b30600160a060020a031684600160a060020a031614151515610ec357600080fd5b600091505b8251821015610f1457828281518110610edd57fe5b906020019060200201519050610ef33382611dd5565b1515610efe57600080fd5b610f09338583611d0e565b600190910190610ec8565b50505050565b600154600090819060a060020a900460ff1615610f3657600080fd5b83600160a060020a031633600160a060020a031614151515610f5757600080fd5b600091505b8251821015610f1457828281518110610f7157fe5b906020019060200201519050610f873382611dd5565b1515610f9257600080fd5b610f9d338583611df5565b600190910190610f5c565b60025433600160a060020a03908116911614610fc357600080fd5b600e55565b60025433600160a060020a03908116911614610fe357600080fd5b600082815260036020526040902054600160a060020a0316151561100657600080fd5b60009182526006602052604090912055565b6000670de0b6b3a76400008210156110535761104c60646110408460c863ffffffff611e5916565b9063ffffffff611e8f16565b9050610b62565b674563918244f400008210156110795761104c606461104084609663ffffffff611e5916565b61104c606461104084608763ffffffff611e5916565b600780548290811061109d57fe5b600091825260209091200154905081565b6110b6612061565b60006110c0612061565b6000806000806110cf88611640565b95508515156110ff5760006040518059106110e75750595b908082528060200260200182016040525096506111a9565b8560405180591061110d5750595b9080825280602002602001820160405250945061112861191b565b935060009250600091505b838210156111a557600780548390811061114957fe5b60009182526020808320909101548083526003909152604090912054909150600160a060020a03908116908916141561119a578085848151811061118957fe5b602090810290910101526001909201915b600190910190611133565b8496505b505050505050919050565b60008060006111d5620186a0611040600b5488611e5990919063ffffffff16565b92506111f3620186a0611040600c5488611e5990919063ffffffff16565b91508382111561121b5761120d828563ffffffff611ea616565b90508281111561121b578092505b505092915050565b60005433600160a060020a0390811691161461123e57600080fd5b60015460a060020a900460ff16151561125657600080fd5b6001805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60005433600160a060020a039081169116146112bd57600080fd5b600160a060020a03811615156112d257600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461130f57600080fd5b600154600054600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60025433600160a060020a0390811691161461139057600080fd5b601055565b60008060008060006113a687611640565b86106113b157600080fd5b600093506113bd61191b565b9250600091505b8282101561142f5760078054839081106113da57fe5b60009182526020808320909101548083526003909152604090912054909150600160a060020a039081169088161415611424578584141561141d5780945061142f565b6001909301925b6001909101906113c4565b5050505092915050565b60015460a060020a900460ff1681565b611451612061565b600780548060200260200160405190810160405280929190818152602001828054801561149d57602002820191906000526020600020905b815481526020019060010190808311611489575b505050505090505b90565b33600160a060020a0381166000908152600860205260409020548015156114ce57600080fd5b600160a060020a03301631819010156114e657600080fd5b6009546114f9908263ffffffff611ea616565b600955600160a060020a0382166000818152600860205260408082209190915582156108fc0290839051600060405180830381858888f193505050501515610d6f57fe5b600081815260036020526040902054600160a060020a0316801515610b6257600080fd5b600081815260036020908152604080832054600d9092528220548392600160a060020a039092169161159282611018565b90509193509193565b600a5481565b60005433600160a060020a039081169116146115bc57600080fd5b60015460a060020a900460ff16156115d357600080fd5b6001805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60105481565b600054600160a060020a031681565b600e5481565b600160a060020a031660009081526005602052604090205490565b611663612061565b60408051908101604052600281527f4d470000000000000000000000000000000000000000000000000000000000006020820152919050565b600d6020526000908152604090205481565b60008281526003602052604090205433600160a060020a039081169116146116d557600080fd5b600f5460ff1615156116e657600080fd5b6000828152600d60205260409020548110610c6757600080fd5b600f5460ff1681565b611711612061565b60015460a060020a900460ff161561172857600080fd5b60016040518059106117375750595b90808252806020026020018201604052509050818160008151811061175857fe5b60209081029091010152610c208382610e71565b60025433600160a060020a0390811691161461178757600080fd5b600f805460ff1916911515919091179055565b6117a2612061565b60015460a060020a900460ff16156117b957600080fd5b60016040518059106117c85750595b9080825280602002602001820160405250905081816000815181106117e957fe5b60209081029091010152610d6f81611b66565b611804612061565b61180c612061565b6000620f4240841061181d57600080fd5b606060405190810160405280602281526020017f68747470733a2f2f6d6574612e7175617a722e696f2f636172642f787878787881526020017f78780000000000000000000000000000000000000000000000000000000000008152509250829150600090505b600781101561191457600a81600a0a8581151561189d57fe5b048115156118a757fe5b066030017f0100000000000000000000000000000000000000000000000000000000000000028282602103815181106118dc57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611884565b5050919050565b60075490565b60009081526006602052604090205490565b600080600080600080600080600160149054906101000a900460ff1615151561195b57600080fd5b600089815260036020526040902054600160a060020a0316151561197e57600080fd5b600089815260036020908152604080832054600d90925290912054600160a060020a039182169950975033168814156119b657600080fd5b34879010156119c457600080fd5b6119cd87611018565b60008a8152600d6020526040902081905595506119eb88338b611d0e565b887f4afcb4a87cdbd9974efdb92ee48bc8d7cd0ae4bf217004db3d080cbaee652ca787611a1789611018565b60405191825260208201526040908101905180910390a2611a4a620186a0611040600a548a611e5990919063ffffffff16565b9450611a59898a876000611eb8565b9350611a6587856111b4565b9250611a8783611a7b898763ffffffff611ea616565b9063ffffffff611ea616565b91508833600160a060020a031689600160a060020a03167ef93dbdb72854b6b6fb35433086556f2635fc83c37080c667496fecfa650fb48a8660405191825260208201526040908101905180910390a430600160a060020a031688600160a060020a0316141515611afc57611afc8883611f87565b503486036000811115611b3a57600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515611b3a57600080fd5b505050505050505050565b60086020526000908152604090205481565b600154600160a060020a031681565b6001546000908190819060a060020a900460ff1615611b8457600080fd5b600092505b8351831015610f1457838381518110611b9e57fe5b90602001906020020151600081815260036020526040902054909250600160a060020a03169050611bcf3383611fd6565b1515611bda57600080fd5b611be5813384611d0e565b600190920191611b89565b60025460009033600160a060020a03908116911614611c0e57600080fd5b50600954600254600160a060020a033081163192909203911681156108fc0282604051600060405180830381858888f193505050501515611c4e57600080fd5b50565b60005433600160a060020a03908116911614611c6c57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611ceb57600080fd5b6102c65a03f11515611cfc57600080fd5b505050604051805190501515610c2057fe5b600160a060020a03808316600081815260056020908152604080832080546001019055858352600390915290208054600160a060020a0319169091179055831615611d8f57600160a060020a03831660009081526005602090815260408083208054600019019055838352600490915290208054600160a060020a03191690555b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600090815260036020526040902054600160a060020a0391821691161490565b600081815260046020526040908190208054600160a060020a031916600160a060020a03858116918217909255839290918616907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925905160405180910390a4505050565b600080831515611e6c5760009150611e88565b50828202828482811515611e7c57fe5b0414611e8457fe5b8091505b5092915050565b6000808284811515611e9d57fe5b04949350505050565b600082821115611eb257fe5b50900390565b60008381526006602052604081205481808215801590611ed9575060105485105b15611f7757600083815260036020526040902054600160a060020a03908116925030168214611f4c57611f0c8287611f87565b828883600160a060020a03167f7875bbe2cfc0c5746093cb37f9404afd9499851458db1f5f0d33475e291dd92c8960405190815260200160405180910390a45b859350611f5e88848888600101611eb8565b9050611f70848263ffffffff611ff616565b9350611f7c565b600093505b505050949350505050565b600e54811015611fa057611f9b8282612005565b610d6f565b600160a060020a03821681156108fc0282604051600060405180830381858888f193505050501515610d6f57610d6f8282612005565b600090815260046020526040902054600160a060020a0391821691161490565b600082820183811015611e8457fe5b600160a060020a03821660009081526008602052604090205461202e908263ffffffff611ff616565b600160a060020a03831660009081526008602052604090205560095461205a908263ffffffff611ff616565b6009555050565b60206040519081016040526000815290565b815481835581811511610c2057600083815260209020610c209181019083016114a591905b808211156120ac5760008155600101612098565b50905600a165627a7a72305820d84796e39bf686ffaa43abe670fb5cf53f51c78fe205ba330f08096404a8b54e0029

Swarm Source

bzzr://d84796e39bf686ffaa43abe670fb5cf53f51c78fe205ba330f08096404a8b54e
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.