ETH Price: $3,410.50 (+2.97%)

Token

Ethmoji (EMJ)
 

Overview

Max Total Supply

1,241 EMJ

Holders

608 (0.00%)

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

OVERVIEW

Ethmoji are provably unique, digital collectibles that live on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Ethmoji

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-03-17
*/

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


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

pragma solidity ^0.4.18;

/**
 * @title ERC721 interface
 * @dev see https://github.com/ethereum/eips/issues/721
 */
contract ERC721 {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function transfer(address _to, uint256 _tokenId) public;
  function approve(address _to, uint256 _tokenId) public;
  function takeOwnership(uint256 _tokenId) public;
}

/**
 * @title ERC721Token
 * Generic implementation for the required functionality of the ERC721 standard
 */
contract ERC721Token is ERC721 {
  using SafeMath for uint256;

  // Total amount of tokens
  uint256 private totalTokens;

  // Mapping from token ID to owner
  mapping (uint256 => address) private tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) private tokenApprovals;

  // Mapping from owner to list of owned token IDs
  mapping (address => uint256[]) private ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping(uint256 => uint256) private ownedTokensIndex;

  /**
  * @dev Guarantees msg.sender is owner of the given token
  * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
  */
  modifier onlyOwnerOf(uint256 _tokenId) {
    require(ownerOf(_tokenId) == msg.sender);
    _;
  }

  /**
  * @dev Gets the total amount of tokens stored by the contract
  * @return uint256 representing the total amount of tokens
  */
  function totalSupply() public view returns (uint256) {
    return totalTokens;
  }

  /**
  * @dev Gets the balance of the specified address
  * @param _owner address to query the balance of
  * @return uint256 representing the amount owned by the passed address
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return ownedTokens[_owner].length;
  }

  /**
  * @dev Gets the list of tokens owned by a given address
  * @param _owner address to query the tokens of
  * @return uint256[] representing the list of tokens owned by the passed address
  */
  function tokensOf(address _owner) public view returns (uint256[]) {
    return ownedTokens[_owner];
  }

  /**
  * @dev Gets the owner of the specified token ID
  * @param _tokenId uint256 ID of the token to query the owner of
  * @return owner address currently marked as the owner of the given token ID
  */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0));
    return owner;
  }

  /**
   * @dev Gets the approved address to take ownership of a given token ID
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved to take ownership of the given token ID
   */
  function approvedFor(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

  /**
  * @dev Transfers the ownership of a given token ID to another address
  * @param _to address to receive the ownership of the given token ID
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function transfer(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) {
    clearApprovalAndTransfer(msg.sender, _to, _tokenId);
  }

  /**
  * @dev Approves another address to claim for the ownership of the given token ID
  * @param _to address to be approved for the given token ID
  * @param _tokenId uint256 ID of the token to be approved
  */
  function approve(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) {
    address owner = ownerOf(_tokenId);
    require(_to != owner);
    if (approvedFor(_tokenId) != 0 || _to != 0) {
      tokenApprovals[_tokenId] = _to;
      Approval(owner, _to, _tokenId);
    }
  }

  /**
  * @dev Claims the ownership of a given token ID
  * @param _tokenId uint256 ID of the token being claimed by the msg.sender
  */
  function takeOwnership(uint256 _tokenId) public {
    require(isApprovedFor(msg.sender, _tokenId));
    clearApprovalAndTransfer(ownerOf(_tokenId), msg.sender, _tokenId);
  }

  /**
  * @dev Mint token function
  * @param _to The address that will own the minted token
  * @param _tokenId uint256 ID of the token to be minted by the msg.sender
  */
  function _mint(address _to, uint256 _tokenId) internal {
    require(_to != address(0));
    addToken(_to, _tokenId);
    Transfer(0x0, _to, _tokenId);
  }

  /**
  * @dev Burns a specific token
  * @param _tokenId uint256 ID of the token being burned by the msg.sender
  */
  function _burn(uint256 _tokenId) onlyOwnerOf(_tokenId) internal {
    if (approvedFor(_tokenId) != 0) {
      clearApproval(msg.sender, _tokenId);
    }
    removeToken(msg.sender, _tokenId);
    Transfer(msg.sender, 0x0, _tokenId);
  }

  /**
   * @dev Tells whether the msg.sender is approved for the given token ID or not
   * This function is not private so it can be extended in further implementations like the operatable ERC721
   * @param _owner address of the owner to query the approval of
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return bool whether the msg.sender is approved for the given token ID or not
   */
  function isApprovedFor(address _owner, uint256 _tokenId) internal view returns (bool) {
    return approvedFor(_tokenId) == _owner;
  }

  /**
  * @dev Internal function to clear current approval and transfer the ownership of a given token ID
  * @param _from address which you want to send tokens from
  * @param _to address which you want to transfer the token to
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function clearApprovalAndTransfer(address _from, address _to, uint256 _tokenId) internal {
    require(_to != address(0));
    require(_to != ownerOf(_tokenId));
    require(ownerOf(_tokenId) == _from);

    clearApproval(_from, _tokenId);
    removeToken(_from, _tokenId);
    addToken(_to, _tokenId);
    Transfer(_from, _to, _tokenId);
  }

  /**
  * @dev Internal function to clear current approval of a given token ID
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function clearApproval(address _owner, uint256 _tokenId) private {
    require(ownerOf(_tokenId) == _owner);
    tokenApprovals[_tokenId] = 0;
    Approval(_owner, 0, _tokenId);
  }

  /**
  * @dev Internal function to add a token ID to the list of a given address
  * @param _to address representing the new owner of the given token ID
  * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
  */
  function addToken(address _to, uint256 _tokenId) private {
    require(tokenOwner[_tokenId] == address(0));
    tokenOwner[_tokenId] = _to;
    uint256 length = balanceOf(_to);
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
    totalTokens = totalTokens.add(1);
  }

  /**
  * @dev Internal function to remove a token ID from the list of a given address
  * @param _from address representing the previous owner of the given token ID
  * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
  */
  function removeToken(address _from, uint256 _tokenId) private {
    require(ownerOf(_tokenId) == _from);

    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = balanceOf(_from).sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

    tokenOwner[_tokenId] = 0;
    ownedTokens[_from][tokenIndex] = lastToken;
    ownedTokens[_from][lastTokenIndex] = 0;
    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    ownedTokens[_from].length--;
    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
    totalTokens = totalTokens.sub(1);
  }
}

/**
 * @title Composable
 * Composable - a contract to mint compositions
 */

contract Composable is ERC721Token, Ownable, PullPayment, Pausable {
   
    // Max number of layers for a composition token
    uint public constant MAX_LAYERS = 100;

    // The minimum composition fee for an ethmoji
    uint256 public minCompositionFee = 0.001 ether;

    // Mapping from token ID to composition price
    mapping (uint256 => uint256) public tokenIdToCompositionPrice;
    
    // Mapping from token ID to layers representing it
    mapping (uint256 => uint256[]) public tokenIdToLayers;

    // Hash of all layers to track uniqueness of ethmojis
    mapping (bytes32 => bool) public compositions;

    // Image hashes to track uniquenes of ethmoji images.
    mapping (uint256 => uint256) public imageHashes;

    // Event for emitting new base token created 
    event BaseTokenCreated(uint256 tokenId);
    
    // Event for emitting new composition token created 
    event CompositionTokenCreated(uint256 tokenId, uint256[] layers, address indexed owner);
    
    // Event for emitting composition price changing for a token
    event CompositionPriceChanged(uint256 tokenId, uint256 price, address indexed owner);

    // Whether or not this contract accepts making compositions with other compositions
    bool public isCompositionOnlyWithBaseLayers;
    
// ----- EXPOSED METHODS --------------------------------------------------------------------------

    /**
    * @dev Mints a base token to an address with a given composition price
    * @param _to address of the future owner of the token
    * @param _compositionPrice uint256 composition price for the new token
    */
    function mintTo(address _to, uint256 _compositionPrice, uint256 _imageHash) public onlyOwner {
        uint256 newTokenIndex = _getNextTokenId();
        _mint(_to, newTokenIndex);
        tokenIdToLayers[newTokenIndex] = [newTokenIndex];
        require(_isUnique(tokenIdToLayers[newTokenIndex], _imageHash));
        compositions[keccak256([newTokenIndex])] = true;
        imageHashes[_imageHash] = newTokenIndex;      
        BaseTokenCreated(newTokenIndex);
        _setCompositionPrice(newTokenIndex, _compositionPrice);
    }

    /**
    * @dev Mints a composition emoji
    * @param _tokenIds uint256[] the array of layers that will make up the composition
    */
    function compose(uint256[] _tokenIds,  uint256 _imageHash) public payable whenNotPaused {
        uint256 price = getTotalCompositionPrice(_tokenIds);
        require(msg.sender != address(0) && msg.value >= price);
        require(_tokenIds.length <= MAX_LAYERS);

        uint256[] memory layers = new uint256[](MAX_LAYERS);
        uint actualSize = 0; 

        for (uint i = 0; i < _tokenIds.length; i++) { 
            uint256 compositionLayerId = _tokenIds[i];
            require(_tokenLayersExist(compositionLayerId));
            uint256[] memory inheritedLayers = tokenIdToLayers[compositionLayerId];
            if (isCompositionOnlyWithBaseLayers) { 
                require(inheritedLayers.length == 1);
            }
            require(inheritedLayers.length < MAX_LAYERS);
            for (uint j = 0; j < inheritedLayers.length; j++) { 
                require(actualSize < MAX_LAYERS);
                for (uint k = 0; k < layers.length; k++) { 
                    require(layers[k] != inheritedLayers[j]);
                    if (layers[k] == 0) { 
                        break;
                    }
                }
                layers[actualSize] = inheritedLayers[j];
                actualSize += 1;
            }
            require(ownerOf(compositionLayerId) != address(0));
            asyncSend(ownerOf(compositionLayerId), tokenIdToCompositionPrice[compositionLayerId]);
        }
    
        uint256 newTokenIndex = _getNextTokenId();
        
        tokenIdToLayers[newTokenIndex] = _trim(layers, actualSize);
        require(_isUnique(tokenIdToLayers[newTokenIndex], _imageHash));
        compositions[keccak256(tokenIdToLayers[newTokenIndex])] = true;
        imageHashes[_imageHash] = newTokenIndex;
    
        _mint(msg.sender, newTokenIndex);

        if (msg.value > price) {
            uint256 purchaseExcess = SafeMath.sub(msg.value, price);
            msg.sender.transfer(purchaseExcess);          
        }

        if (!isCompositionOnlyWithBaseLayers) { 
            _setCompositionPrice(newTokenIndex, minCompositionFee);
        }
   
        CompositionTokenCreated(newTokenIndex, tokenIdToLayers[newTokenIndex], msg.sender);
    }

    /**
    * @dev allows an address to withdraw its balance in the contract
    * @param _tokenId uint256 the token ID
    * @return uint256[] list of layers for a token
    */
    function getTokenLayers(uint256 _tokenId) public view returns(uint256[]) {
        return tokenIdToLayers[_tokenId];
    }

    /**
    * @dev given an array of ids, returns whether or not this composition is valid and unique
    * does not assume the layers array is flattened 
    * @param _tokenIds uint256[] an array of token IDs
    * @return bool whether or not the composition is unique
    */
    function isValidComposition(uint256[] _tokenIds, uint256 _imageHash) public view returns (bool) { 
        if (isCompositionOnlyWithBaseLayers) { 
            return _isValidBaseLayersOnly(_tokenIds, _imageHash);
        } else { 
            return _isValidWithCompositions(_tokenIds, _imageHash);
        }
    }

    /**
    * @dev returns composition price of a given token ID
    * @param _tokenId uint256 token ID
    * @return uint256 composition price
    */
    function getCompositionPrice(uint256 _tokenId) public view returns(uint256) { 
        return tokenIdToCompositionPrice[_tokenId];
    }

    /**
    * @dev get total price for minting a composition given the array of desired layers
    * @param _tokenIds uint256[] an array of token IDs
    * @return uint256 price for minting a composition with the desired layers
    */
    function getTotalCompositionPrice(uint256[] _tokenIds) public view returns(uint256) {
        uint256 totalCompositionPrice = 0;
        for (uint i = 0; i < _tokenIds.length; i++) {
            require(_tokenLayersExist(_tokenIds[i]));
            totalCompositionPrice = SafeMath.add(totalCompositionPrice, tokenIdToCompositionPrice[_tokenIds[i]]);
        }

        totalCompositionPrice = SafeMath.div(SafeMath.mul(totalCompositionPrice, 105), 100);

        return totalCompositionPrice;
    }

    /**
    * @dev sets the composition price for a token ID. 
    * Cannot be lower than the current composition fee
    * @param _tokenId uint256 the token ID
    * @param _price uint256 the new composition price
    */
    function setCompositionPrice(uint256 _tokenId, uint256 _price) public onlyOwnerOf(_tokenId) {
        _setCompositionPrice(_tokenId, _price);
    }

// ----- PRIVATE FUNCTIONS ------------------------------------------------------------------------

    /**
    * @dev given an array of ids, returns whether or not this composition is valid and unique
    * for when only base layers are allowed
    * does not assume the layers array is flattened 
    * @param _tokenIds uint256[] an array of token IDs
    * @return bool whether or not the composition is unique
    */
    function _isValidBaseLayersOnly(uint256[] _tokenIds, uint256 _imageHash) private view returns (bool) { 
        require(_tokenIds.length <= MAX_LAYERS);
        uint256[] memory layers = new uint256[](_tokenIds.length);

        for (uint i = 0; i < _tokenIds.length; i++) { 
            if (!_tokenLayersExist(_tokenIds[i])) {
                return false;
            }

            if (tokenIdToLayers[_tokenIds[i]].length != 1) {
                return false;
            }

            for (uint k = 0; k < layers.length; k++) { 
                if (layers[k] == tokenIdToLayers[_tokenIds[i]][0]) {
                    return false;
                }
                if (layers[k] == 0) { 
                    layers[k] = tokenIdToLayers[_tokenIds[i]][0];
                    break;
                }
            }
        }
    
        return _isUnique(layers, _imageHash);
    }

    /**
    * @dev given an array of ids, returns whether or not this composition is valid and unique
    * when compositions are allowed
    * does not assume the layers array is flattened 
    * @param _tokenIds uint256[] an array of token IDs
    * @return bool whether or not the composition is unique
    */
    function _isValidWithCompositions(uint256[] _tokenIds, uint256 _imageHash) private view returns (bool) { 
        uint256[] memory layers = new uint256[](MAX_LAYERS);
        uint actualSize = 0; 
        if (_tokenIds.length > MAX_LAYERS) { 
            return false;
        }

        for (uint i = 0; i < _tokenIds.length; i++) { 
            uint256 compositionLayerId = _tokenIds[i];
            if (!_tokenLayersExist(compositionLayerId)) { 
                return false;
            }
            uint256[] memory inheritedLayers = tokenIdToLayers[compositionLayerId];
            require(inheritedLayers.length < MAX_LAYERS);
            for (uint j = 0; j < inheritedLayers.length; j++) { 
                require(actualSize < MAX_LAYERS);
                for (uint k = 0; k < layers.length; k++) { 
                    if (layers[k] == inheritedLayers[j]) {
                        return false;
                    }
                    if (layers[k] == 0) { 
                        break;
                    }
                }
                layers[actualSize] = inheritedLayers[j];
                actualSize += 1;
            }
        }
        return _isUnique(_trim(layers, actualSize), _imageHash);
    }

    /**
    * @dev trims the given array to a given size
    * @param _layers uint256[] the array of layers that will make up the composition
    * @param _size uint the array of layers that will make up the composition
    * @return uint256[] array trimmed to given size
    */
    function _trim(uint256[] _layers, uint _size) private pure returns(uint256[]) { 
        uint256[] memory trimmedLayers = new uint256[](_size);
        for (uint i = 0; i < _size; i++) { 
            trimmedLayers[i] = _layers[i];
        }

        return trimmedLayers;
    }

    /**
    * @dev checks if a token is an existing token by checking if it has non-zero layers
    * @param _tokenId uint256 token ID
    * @return bool whether or not the given tokenId exists according to its layers
    */
    function _tokenLayersExist(uint256 _tokenId) private view returns (bool) { 
        return tokenIdToLayers[_tokenId].length != 0;
    }

    /**
    * @dev set composition price for a token
    * @param _tokenId uint256 token ID
    * @param _price uint256 new composition price
    */
    function _setCompositionPrice(uint256 _tokenId, uint256 _price) private {
        require(_price >= minCompositionFee);
        tokenIdToCompositionPrice[_tokenId] = _price;
        CompositionPriceChanged(_tokenId, _price, msg.sender);
    }

    /**
    * @dev calculates the next token ID based on totalSupply
    * @return uint256 for the next token ID
    */
    function _getNextTokenId() private view returns (uint256) {
        return totalSupply().add(1); 
    }

    /**
    * @dev given an array of ids, returns whether or not this composition is unique
    * assumes the layers are all base layers (flattened)
    * @param _layers uint256[] an array of token IDs
    * @param _imageHash uint256 image hash for the composition
    * @return bool whether or not the composition is unique
    */
    function _isUnique(uint256[] _layers, uint256 _imageHash) private view returns (bool) { 
        return compositions[keccak256(_layers)] == false && imageHashes[_imageHash] == 0;
    }

// ----- ONLY OWNER FUNCTIONS ---------------------------------------------------------------------

    /**
    * @dev payout method for the contract owner to payout contract profits to a given address
    * @param _to address for the payout 
    */
    function payout (address _to) public onlyOwner { 
        totalPayments = 0;
        _to.transfer(this.balance);
    }

    /**
    * @dev sets global default composition fee for all new tokens
    * @param _price uint256 new default composition price
    */
    function setGlobalCompositionFee(uint256 _price) public onlyOwner { 
        minCompositionFee = _price;
    }
}

contract Ethmoji is Composable {
    using SafeMath for uint256;

    string public constant NAME = "Ethmoji";
    string public constant SYMBOL = "EMJ";

    // Mapping from address to emoji representing avatar
    mapping (address => uint256) public addressToAvatar;

    function Ethmoji() public { 
        isCompositionOnlyWithBaseLayers = true;
    }

    /**
    * @dev Mints a base token to an address with a given composition price
    * @param _to address of the future owner of the token
    * @param _compositionPrice uint256 composition price for the new token
    */
    function mintTo(address _to, uint256 _compositionPrice, uint256 _imageHash) public onlyOwner {
        Composable.mintTo(_to, _compositionPrice, _imageHash);
        _setAvatarIfNoAvatarIsSet(_to, tokensOf(_to)[0]);
    }

    /**
    * @dev Mints a composition emoji
    * @param _tokenIds uint256[] the array of layers that will make up the composition
    */
    function compose(uint256[] _tokenIds,  uint256 _imageHash) public payable whenNotPaused {
        Composable.compose(_tokenIds, _imageHash);
        _setAvatarIfNoAvatarIsSet(msg.sender, tokensOf(msg.sender)[0]);


        // Immediately pay out to layer owners
        for (uint8 i = 0; i < _tokenIds.length; i++) {
            _withdrawTo(ownerOf(_tokenIds[i]));
        }
    }

// ----- EXPOSED METHODS --------------------------------------------------------------------------

    /**
    * @dev returns the name ETHMOJI
    * @return string ETHMOJI
    */
    function name() public pure returns (string) {
        return NAME;
    }

    /**
    * @dev returns the name EMJ
    * @return string EMJ
    */
    function symbol() public pure returns (string) {
        return SYMBOL;
    }

    /**
    * @dev sets avatar for an address
    * @param _tokenId uint256 token ID
    */
    function setAvatar(uint256 _tokenId) public onlyOwnerOf(_tokenId) whenNotPaused {
        addressToAvatar[msg.sender] = _tokenId;
    }

    /**
    * @dev returns the ID representing the avatar of the address
    * @param _owner address
    * @return uint256 token ID of the avatar associated with that address
    */
    function getAvatar(address _owner) public view returns(uint256) {
        return addressToAvatar[_owner];
    }

    /**
    * @dev transfer ownership of token. keeps track of avatar logic
    * @param _to address to whom the token is being transferred to
    * @param _tokenId uint256 the ID of the token being transferred
    */
    function transfer(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) whenNotPaused {
        // If the transferred token was previous owner's avatar, remove it
        if (addressToAvatar[msg.sender] == _tokenId) {
            _removeAvatar(msg.sender);
        }

        ERC721Token.transfer(_to, _tokenId);
    }

// ----- PRIVATE FUNCTIONS ------------------------------------------------------------------------

    /**
    * @dev sets avatar if no avatar was previously set
    * @param _owner address of the new vatara owner
    * @param _tokenId uint256 token ID
    */
    function _setAvatarIfNoAvatarIsSet(address _owner, uint256 _tokenId) private {
        if (addressToAvatar[_owner] == 0) {
            addressToAvatar[_owner] = _tokenId;
        }
    }

    /**
    * @dev removes avatar for address
    * @param _owner address of the avatar owner
    */
    function _removeAvatar(address _owner) private {
        addressToAvatar[_owner] = 0;
    }

    /**
    * @dev withdraw accumulated balance to the payee
    * @param _payee address to which to withdraw to
    */
    function _withdrawTo(address _payee) private {
        uint256 payment = payments[_payee];

        if (payment != 0 && this.balance >= payment) {
            totalPayments = totalPayments.sub(payment);
            payments[_payee] = 0;

            _payee.transfer(payment);
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"totalPayments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_imageHash","type":"uint256"}],"name":"compose","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"payout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"}],"name":"setGlobalCompositionFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"getTotalCompositionPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCompositionPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"approvedFor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_compositionPrice","type":"uint256"},{"name":"_imageHash","type":"uint256"}],"name":"mintTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenIdToCompositionPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"tokenIdToLayers","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOf","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":false,"inputs":[],"name":"withdrawPayments","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":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"compositions","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"imageHashes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getTokenLayers","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isCompositionOnlyWithBaseLayers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minCompositionFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_LAYERS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getAvatar","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_imageHash","type":"uint256"}],"name":"isValidComposition","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_price","type":"uint256"}],"name":"setCompositionPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"setAvatar","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"payments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressToAvatar","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"BaseTokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"layers","type":"uint256[]"},{"indexed":true,"name":"owner","type":"address"}],"name":"CompositionTokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":true,"name":"owner","type":"address"}],"name":"CompositionPriceChanged","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"},{"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"},{"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"}]

60606040526000600860006101000a81548160ff02191690831515021790555066038d7ea4c68000600955341561003557600080fd5b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60006101000a81548160ff02191690831515021790555061356c806100a06000396000f3006060604052600436106101e2576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680625b4487146101e7578063030838831461021057806306fdde0314610268578063095ea7b3146102f65780630b7e9c441461033857806318160ddd146103715780631875ccf31461039a5780631983111d146103bd5780631f89e9111461042b5780632a6dd48f146104625780632baf2acb146104c557806338e50d3c146105105780633f27afa7146105475780633f4ba83a146105875780635a3f26721461059c5780635c975abb1461062a5780636103d70b146106575780636352211e1461066c57806370a08231146106cf57806370e2b6251461071c5780638456cb591461075b5780638da5cb5b1461077057806395d89b41146107c5578063a3f4df7e14610853578063a8d4ab6c146108e1578063a9059cbb14610918578063aae07cd01461095a578063b2e6ceeb146109d2578063b9e3a8dd146109f5578063c73ec2eb14610a22578063c829b0e314610a4b578063ce8ac03314610a74578063d2769df114610ac1578063d5e0d8fc14610b3c578063df0bcf4d14610b68578063e2982c2114610b8b578063f2fde38b14610bd8578063f76f8d7814610c11578063ff4843dc14610c9f575b600080fd5b34156101f257600080fd5b6101fa610cec565b6040518082815260200191505060405180910390f35b610266600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091905050610cf2565b005b341561027357600080fd5b61027b610d92565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102bb5780820151818401526020810190506102a0565b50505050905090810190601f1680156102e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030157600080fd5b610336600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b005b341561034357600080fd5b61036f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f68565b005b341561037c57600080fd5b610384611026565b6040518082815260200191505060405180910390f35b34156103a557600080fd5b6103bb600480803590602001909190505061102f565b005b34156103c857600080fd5b610415600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050611095565b6040518082815260200191505060405180910390f35b341561043657600080fd5b61044c600480803590602001909190505061113a565b6040518082815260200191505060405180910390f35b341561046d57600080fd5b6104836004808035906020019091905050611157565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104d057600080fd5b61050e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611194565b005b341561051b57600080fd5b610531600480803590602001909190505061122a565b6040518082815260200191505060405180910390f35b341561055257600080fd5b6105716004808035906020019091908035906020019091905050611242565b6040518082815260200191505060405180910390f35b341561059257600080fd5b61059a611273565b005b34156105a757600080fd5b6105d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611333565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106165780820151818401526020810190506105fb565b505050509050019250505060405180910390f35b341561063557600080fd5b61063d6113d0565b604051808215151515815260200191505060405180910390f35b341561066257600080fd5b61066a6113e3565b005b341561067757600080fd5b61068d6004808035906020019091905050611502565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611580565b6040518082815260200191505060405180910390f35b341561072757600080fd5b6107416004808035600019169060200190919050506115cc565b604051808215151515815260200191505060405180910390f35b341561076657600080fd5b61076e6115ec565b005b341561077b57600080fd5b6107836116ad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107d057600080fd5b6107d86116d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108185780820151818401526020810190506107fd565b50505050905090810190601f1680156108455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561085e57600080fd5b610866611716565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108a657808201518184015260208101905061088b565b50505050905090810190601f1680156108d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108ec57600080fd5b610902600480803590602001909190505061174f565b6040518082815260200191505060405180910390f35b341561092357600080fd5b610958600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611767565b005b341561096557600080fd5b61097b6004808035906020019091905050611826565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109be5780820151818401526020810190506109a3565b505050509050019250505060405180910390f35b34156109dd57600080fd5b6109f36004808035906020019091905050611897565b005b3415610a0057600080fd5b610a086118c2565b604051808215151515815260200191505060405180910390f35b3415610a2d57600080fd5b610a356118d5565b6040518082815260200191505060405180910390f35b3415610a5657600080fd5b610a5e6118db565b6040518082815260200191505060405180910390f35b3415610a7f57600080fd5b610aab600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118e0565b6040518082815260200191505060405180910390f35b3415610acc57600080fd5b610b22600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091905050611929565b604051808215151515815260200191505060405180910390f35b3415610b4757600080fd5b610b666004808035906020019091908035906020019091905050611964565b005b3415610b7357600080fd5b610b8960048080359060200190919050506119b6565b005b3415610b9657600080fd5b610bc2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a5d565b6040518082815260200191505060405180910390f35b3415610be357600080fd5b610c0f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a75565b005b3415610c1c57600080fd5b610c24611bcd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c64578082015181840152602081019050610c49565b50505050905090810190601f168015610c915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610caa57600080fd5b610cd6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c06565b6040518082815260200191505060405180910390f35b60075481565b6000600860009054906101000a900460ff16151515610d1057600080fd5b610d1a8383611c1e565b610d4433610d2733611333565b6000815181101515610d3557fe5b90602001906020020151612192565b600090505b82518160ff161015610d8d57610d80610d7b848360ff16815181101515610d6c57fe5b90602001906020020151611502565b612223565b8080600101915050610d49565b505050565b610d9a613401565b6040805190810160405280600781526020017f4574686d6f6a6900000000000000000000000000000000000000000000000000815250905090565b6000813373ffffffffffffffffffffffffffffffffffffffff16610df882611502565b73ffffffffffffffffffffffffffffffffffffffff16141515610e1a57600080fd5b610e2383611502565b91508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610e6057600080fd5b6000610e6b84611157565b73ffffffffffffffffffffffffffffffffffffffff16141580610ea5575060008473ffffffffffffffffffffffffffffffffffffffff1614155b15610f6257836002600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a35b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fc457600080fd5b60006007819055508073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561102357600080fd5b50565b60008054905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561108b57600080fd5b8060098190555050565b6000806000809150600090505b8351811015611119576110cb84828151811015156110bc57fe5b90602001906020020151612339565b15156110d657600080fd5b61110a82600a600087858151811015156110ec57fe5b9060200190602002015181526020019081526020016000205461235c565b915080806001019150506110a2565b61112e61112783606961237a565b60646123b5565b91508192505050919050565b6000600a6000838152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111f057600080fd5b6111fb8383836123d0565b6112258361120885611333565b600081518110151561121657fe5b90602001906020020151612192565b505050565b600a6020528060005260406000206000915090505481565b600b6020528160005260406000208181548110151561125d57fe5b9060005260206000209001600091509150505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112cf57600080fd5b600860009054906101000a900460ff1615156112ea57600080fd5b6000600860006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b61133b613415565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156113c457602002820191906000526020600020905b8154815260200190600101908083116113b0575b50505050509050919050565b600860009054906101000a900460ff1681565b600080339150600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415151561143b57600080fd5b803073ffffffffffffffffffffffffffffffffffffffff16311015151561146157600080fd5b611476816007546125c990919063ffffffff16565b6007819055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156114fe57fe5b5050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561157757600080fd5b80915050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164857600080fd5b600860009054906101000a900460ff1615151561166457600080fd5b6001600860006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116db613401565b6040805190810160405280600381526020017f454d4a0000000000000000000000000000000000000000000000000000000000815250905090565b6040805190810160405280600781526020017f4574686d6f6a690000000000000000000000000000000000000000000000000081525081565b600d6020528060005260406000206000915090505481565b803373ffffffffffffffffffffffffffffffffffffffff1661178882611502565b73ffffffffffffffffffffffffffffffffffffffff161415156117aa57600080fd5b600860009054906101000a900460ff161515156117c657600080fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561181757611816336125e2565b5b611821838361262a565b505050565b61182e613415565b600b600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561188b57602002820191906000526020600020905b815481526020019060010190808311611877575b50505050509050919050565b6118a1338261267d565b15156118ac57600080fd5b6118bf6118b882611502565b33836126be565b50565b600e60009054906101000a900460ff1681565b60095481565b606481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60009054906101000a900460ff16156119515761194a8383612807565b905061195e565b61195b83836129f2565b90505b92915050565b813373ffffffffffffffffffffffffffffffffffffffff1661198582611502565b73ffffffffffffffffffffffffffffffffffffffff161415156119a757600080fd5b6119b18383612c0c565b505050565b803373ffffffffffffffffffffffffffffffffffffffff166119d782611502565b73ffffffffffffffffffffffffffffffffffffffff161415156119f957600080fd5b600860009054906101000a900460ff16151515611a1557600080fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60066020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ad157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b0d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600381526020017f454d4a000000000000000000000000000000000000000000000000000000000081525081565b600f6020528060005260406000206000915090505481565b6000611c28613415565b6000806000611c35613415565b600080600080600860009054906101000a900460ff16151515611c5757600080fd5b611c608c611095565b9950600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611c9f5750893410155b1515611caa57600080fd5b60648c5111151515611cbb57600080fd5b6064604051805910611cca5750595b9080825280602002602001820160405250985060009750600096505b8b51871015611f0e578b87815181101515611cfd57fe5b906020019060200201519550611d1286612339565b1515611d1d57600080fd5b600b6000878152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611d7a57602002820191906000526020600020905b815481526020019060010190808311611d66575b50505050509450600e60009054906101000a900460ff1615611da75760018551141515611da657600080fd5b5b60648551101515611db757600080fd5b600093505b8451841015611e9857606488101515611dd457600080fd5b600092505b8851831015611e51578484815181101515611df057fe5b906020019060200201518984815181101515611e0857fe5b9060200190602002015114151515611e1f57600080fd5b60008984815181101515611e2f57fe5b906020019060200201511415611e4457611e51565b8280600101935050611dd9565b8484815181101515611e5f57fe5b906020019060200201518989815181101515611e7757fe5b90602001906020020181815250506001880197508380600101945050611dbc565b600073ffffffffffffffffffffffffffffffffffffffff16611eb987611502565b73ffffffffffffffffffffffffffffffffffffffff1614151515611edc57600080fd5b611f01611ee887611502565b600a600089815260200190815260200160002054612c8f565b8680600101975050611ce6565b611f16612d43565b9150611f228989612d65565b600b60008481526020019081526020016000209080519060200190611f48929190613429565b50611fb4600b6000848152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611fa957602002820191906000526020600020905b815481526020019060010190808311611f95575b50505050508c612df1565b1515611fbf57600080fd5b6001600c6000600b600086815260200190815260200160002060405180828054801561200a57602002820191906000526020600020905b815481526020019060010190808311611ff6575b505091505060405180910390206000191660001916815260200190815260200160002060006101000a81548160ff02191690831515021790555081600d60008d8152602001908152602001600020819055506120663383612e8b565b893411156120bb57612078348b6125c9565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156120ba57600080fd5b5b600e60009054906101000a900460ff1615156120de576120dd82600954612c0c565b5b3373ffffffffffffffffffffffffffffffffffffffff167f8258990f4da6775c9379703a14a2d112f3131e6b3a3840d1f6c25ccfe1051b9d83600b60008681526020019081526020016000206040518083815260200180602001828103825283818154815260200191508054801561217557602002820191906000526020600020905b815481526020019060010190808311612161575b5050935050505060405180910390a2505050505050505050505050565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561221f5780600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415801561228f5750803073ffffffffffffffffffffffffffffffffffffffff163110155b15612335576122a9816007546125c990919063ffffffff16565b6007819055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561233457600080fd5b5b5050565b600080600b60008481526020019081526020016000208054905014159050919050565b600080828401905083811015151561237057fe5b8091505092915050565b600080600084141561238f57600091506123ae565b82840290508284828115156123a057fe5b041415156123aa57fe5b8091505b5092915050565b60008082848115156123c357fe5b0490508091505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561242e57600080fd5b612436612d43565b90506124428482612e8b565b60206040519081016040528082815250600b6000838152602001908152602001600020906001612473929190613476565b506124df600b60008381526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156124d457602002820191906000526020600020905b8154815260200190600101908083116124c0575b505050505083612df1565b15156124ea57600080fd5b6001600c6000602060405190810160405280858152506040518082600160200280838360005b8381101561252b578082015181840152602081019050612510565b5050505090500191505060405180910390206000191660001916815260200190815260200160002060006101000a81548160ff02191690831515021790555080600d6000848152602001908152602001600020819055507f3f5bdceccefc96a1f5b67e0c030e1f5f27d4f940582f4114ee08d3599912e216816040518082815260200191505060405180910390a16125c38184612c0c565b50505050565b60008282111515156125d757fe5b818303905092915050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b803373ffffffffffffffffffffffffffffffffffffffff1661264b82611502565b73ffffffffffffffffffffffffffffffffffffffff1614151561266d57600080fd5b6126783384846126be565b505050565b60008273ffffffffffffffffffffffffffffffffffffffff1661269f83611157565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156126fa57600080fd5b61270381611502565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561273d57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1661275d82611502565b73ffffffffffffffffffffffffffffffffffffffff1614151561277f57600080fd5b6127898382612f25565b612793838261300e565b61279d8282613296565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000612811613415565b600080606486511115151561282557600080fd5b85516040518059106128345750595b90808252806020026020018201604052509250600091505b85518210156129dc57612875868381518110151561286657fe5b90602001906020020151612339565b151561288457600093506129e9565b6001600b6000888581518110151561289857fe5b906020019060200201518152602001908152602001600020805490501415156128c457600093506129e9565b600090505b82518110156129cf57600b600087848151811015156128e457fe5b906020019060200201518152602001908152602001600020600081548110151561290a57fe5b906000526020600020900154838281518110151561292457fe5b90602001906020020151141561293d57600093506129e9565b6000838281518110151561294d57fe5b9060200190602002015114156129c257600b6000878481518110151561296f57fe5b906020019060200201518152602001908152602001600020600081548110151561299557fe5b90600052602060002090015483828151811015156129af57fe5b90602001906020020181815250506129cf565b80806001019150506128c9565b818060010192505061284c565b6129e68386612df1565b93505b50505092915050565b60006129fc613415565b6000806000612a09613415565b6000806064604051805910612a1b5750595b908082528060200260200182016040525096506000955060648a511115612a455760009750612bff565b600094505b8951851015612be9578985815181101515612a6157fe5b906020019060200201519350612a7684612339565b1515612a855760009750612bff565b600b6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612ae257602002820191906000526020600020905b815481526020019060010190808311612ace575b5050505050925060648351101515612af957600080fd5b600091505b8251821015612bdc57606486101515612b1657600080fd5b600090505b8651811015612b95578282815181101515612b3257fe5b906020019060200201518782815181101515612b4a57fe5b906020019060200201511415612b635760009750612bff565b60008782815181101515612b7357fe5b906020019060200201511415612b8857612b95565b8080600101915050612b1b565b8282815181101515612ba357fe5b906020019060200201518787815181101515612bbb57fe5b90602001906020020181815250506001860195508180600101925050612afe565b8480600101955050612a4a565b612bfc612bf68888612d65565b8a612df1565b97505b5050505050505092915050565b6009548110151515612c1d57600080fd5b80600a6000848152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f372883ed096f3aca24c33c36571b41f60a645cb114b5590f319e2e1c2606db6e8383604051808381526020018281526020019250505060405180910390a25050565b612ce181600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461235c90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d398160075461235c90919063ffffffff16565b6007819055505050565b6000612d606001612d52611026565b61235c90919063ffffffff16565b905090565b612d6d613415565b612d75613415565b600083604051805910612d855750595b90808252806020026020018201604052509150600090505b83811015612de6578481815181101515612db357fe5b906020019060200201518282815181101515612dcb57fe5b90602001906020020181815250508080600101915050612d9d565b819250505092915050565b6000801515600c60008560405180828051906020019060200280838360005b83811015612e2b578082015181840152602081019050612e10565b5050505090500191505060405180910390206000191660001916815260200190815260200160002060009054906101000a900460ff161515148015612e8357506000600d600084815260200190815260200160002054145b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612ec757600080fd5b612ed18282613296565b8173ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff16612f4582611502565b73ffffffffffffffffffffffffffffffffffffffff16141515612f6757600080fd5b60006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b60008060008473ffffffffffffffffffffffffffffffffffffffff1661303385611502565b73ffffffffffffffffffffffffffffffffffffffff1614151561305557600080fd5b60046000858152602001908152602001600020549250613087600161307987611580565b6125c990919063ffffffff16565b9150600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156130d557fe5b906000526020600020900154905060006001600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561318357fe5b9060005260206000209001819055506000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156131e057fe5b906000526020600020900181905550600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361324191906134c3565b506000600460008681526020019081526020016000208190555082600460008381526020019081526020016000208190555061328960016000546125c990919063ffffffff16565b6000819055505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561330557600080fd5b826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061336083611580565b9050600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816133b391906134ef565b9160005260206000209001600084909190915055508060046000848152602001908152602001600020819055506133f6600160005461235c90919063ffffffff16565b600081905550505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054828255906000526020600020908101928215613465579160200282015b82811115613464578251825591602001919060010190613449565b5b509050613472919061351b565b5090565b8280548282559060005260206000209081019282156134b2579160200282015b828111156134b1578251825591602001919060010190613496565b5b5090506134bf919061351b565b5090565b8154818355818115116134ea578183600052602060002091820191016134e9919061351b565b5b505050565b81548183558181151161351657818360005260206000209182019101613515919061351b565b5b505050565b61353d91905b80821115613539576000816000905550600101613521565b5090565b905600a165627a7a72305820141ae1431bc54f4b294a2dab8a704f005fd0a7a16714bd35243d958796a54c9c0029

Deployed Bytecode

0x6060604052600436106101e2576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680625b4487146101e7578063030838831461021057806306fdde0314610268578063095ea7b3146102f65780630b7e9c441461033857806318160ddd146103715780631875ccf31461039a5780631983111d146103bd5780631f89e9111461042b5780632a6dd48f146104625780632baf2acb146104c557806338e50d3c146105105780633f27afa7146105475780633f4ba83a146105875780635a3f26721461059c5780635c975abb1461062a5780636103d70b146106575780636352211e1461066c57806370a08231146106cf57806370e2b6251461071c5780638456cb591461075b5780638da5cb5b1461077057806395d89b41146107c5578063a3f4df7e14610853578063a8d4ab6c146108e1578063a9059cbb14610918578063aae07cd01461095a578063b2e6ceeb146109d2578063b9e3a8dd146109f5578063c73ec2eb14610a22578063c829b0e314610a4b578063ce8ac03314610a74578063d2769df114610ac1578063d5e0d8fc14610b3c578063df0bcf4d14610b68578063e2982c2114610b8b578063f2fde38b14610bd8578063f76f8d7814610c11578063ff4843dc14610c9f575b600080fd5b34156101f257600080fd5b6101fa610cec565b6040518082815260200191505060405180910390f35b610266600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091905050610cf2565b005b341561027357600080fd5b61027b610d92565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102bb5780820151818401526020810190506102a0565b50505050905090810190601f1680156102e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030157600080fd5b610336600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b005b341561034357600080fd5b61036f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f68565b005b341561037c57600080fd5b610384611026565b6040518082815260200191505060405180910390f35b34156103a557600080fd5b6103bb600480803590602001909190505061102f565b005b34156103c857600080fd5b610415600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050611095565b6040518082815260200191505060405180910390f35b341561043657600080fd5b61044c600480803590602001909190505061113a565b6040518082815260200191505060405180910390f35b341561046d57600080fd5b6104836004808035906020019091905050611157565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104d057600080fd5b61050e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611194565b005b341561051b57600080fd5b610531600480803590602001909190505061122a565b6040518082815260200191505060405180910390f35b341561055257600080fd5b6105716004808035906020019091908035906020019091905050611242565b6040518082815260200191505060405180910390f35b341561059257600080fd5b61059a611273565b005b34156105a757600080fd5b6105d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611333565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106165780820151818401526020810190506105fb565b505050509050019250505060405180910390f35b341561063557600080fd5b61063d6113d0565b604051808215151515815260200191505060405180910390f35b341561066257600080fd5b61066a6113e3565b005b341561067757600080fd5b61068d6004808035906020019091905050611502565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611580565b6040518082815260200191505060405180910390f35b341561072757600080fd5b6107416004808035600019169060200190919050506115cc565b604051808215151515815260200191505060405180910390f35b341561076657600080fd5b61076e6115ec565b005b341561077b57600080fd5b6107836116ad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107d057600080fd5b6107d86116d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108185780820151818401526020810190506107fd565b50505050905090810190601f1680156108455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561085e57600080fd5b610866611716565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108a657808201518184015260208101905061088b565b50505050905090810190601f1680156108d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108ec57600080fd5b610902600480803590602001909190505061174f565b6040518082815260200191505060405180910390f35b341561092357600080fd5b610958600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611767565b005b341561096557600080fd5b61097b6004808035906020019091905050611826565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109be5780820151818401526020810190506109a3565b505050509050019250505060405180910390f35b34156109dd57600080fd5b6109f36004808035906020019091905050611897565b005b3415610a0057600080fd5b610a086118c2565b604051808215151515815260200191505060405180910390f35b3415610a2d57600080fd5b610a356118d5565b6040518082815260200191505060405180910390f35b3415610a5657600080fd5b610a5e6118db565b6040518082815260200191505060405180910390f35b3415610a7f57600080fd5b610aab600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118e0565b6040518082815260200191505060405180910390f35b3415610acc57600080fd5b610b22600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019091905050611929565b604051808215151515815260200191505060405180910390f35b3415610b4757600080fd5b610b666004808035906020019091908035906020019091905050611964565b005b3415610b7357600080fd5b610b8960048080359060200190919050506119b6565b005b3415610b9657600080fd5b610bc2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a5d565b6040518082815260200191505060405180910390f35b3415610be357600080fd5b610c0f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a75565b005b3415610c1c57600080fd5b610c24611bcd565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c64578082015181840152602081019050610c49565b50505050905090810190601f168015610c915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610caa57600080fd5b610cd6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c06565b6040518082815260200191505060405180910390f35b60075481565b6000600860009054906101000a900460ff16151515610d1057600080fd5b610d1a8383611c1e565b610d4433610d2733611333565b6000815181101515610d3557fe5b90602001906020020151612192565b600090505b82518160ff161015610d8d57610d80610d7b848360ff16815181101515610d6c57fe5b90602001906020020151611502565b612223565b8080600101915050610d49565b505050565b610d9a613401565b6040805190810160405280600781526020017f4574686d6f6a6900000000000000000000000000000000000000000000000000815250905090565b6000813373ffffffffffffffffffffffffffffffffffffffff16610df882611502565b73ffffffffffffffffffffffffffffffffffffffff16141515610e1a57600080fd5b610e2383611502565b91508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610e6057600080fd5b6000610e6b84611157565b73ffffffffffffffffffffffffffffffffffffffff16141580610ea5575060008473ffffffffffffffffffffffffffffffffffffffff1614155b15610f6257836002600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a35b50505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fc457600080fd5b60006007819055508073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561102357600080fd5b50565b60008054905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561108b57600080fd5b8060098190555050565b6000806000809150600090505b8351811015611119576110cb84828151811015156110bc57fe5b90602001906020020151612339565b15156110d657600080fd5b61110a82600a600087858151811015156110ec57fe5b9060200190602002015181526020019081526020016000205461235c565b915080806001019150506110a2565b61112e61112783606961237a565b60646123b5565b91508192505050919050565b6000600a6000838152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111f057600080fd5b6111fb8383836123d0565b6112258361120885611333565b600081518110151561121657fe5b90602001906020020151612192565b505050565b600a6020528060005260406000206000915090505481565b600b6020528160005260406000208181548110151561125d57fe5b9060005260206000209001600091509150505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112cf57600080fd5b600860009054906101000a900460ff1615156112ea57600080fd5b6000600860006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b61133b613415565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156113c457602002820191906000526020600020905b8154815260200190600101908083116113b0575b50505050509050919050565b600860009054906101000a900460ff1681565b600080339150600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415151561143b57600080fd5b803073ffffffffffffffffffffffffffffffffffffffff16311015151561146157600080fd5b611476816007546125c990919063ffffffff16565b6007819055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156114fe57fe5b5050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561157757600080fd5b80915050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164857600080fd5b600860009054906101000a900460ff1615151561166457600080fd5b6001600860006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116db613401565b6040805190810160405280600381526020017f454d4a0000000000000000000000000000000000000000000000000000000000815250905090565b6040805190810160405280600781526020017f4574686d6f6a690000000000000000000000000000000000000000000000000081525081565b600d6020528060005260406000206000915090505481565b803373ffffffffffffffffffffffffffffffffffffffff1661178882611502565b73ffffffffffffffffffffffffffffffffffffffff161415156117aa57600080fd5b600860009054906101000a900460ff161515156117c657600080fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561181757611816336125e2565b5b611821838361262a565b505050565b61182e613415565b600b600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561188b57602002820191906000526020600020905b815481526020019060010190808311611877575b50505050509050919050565b6118a1338261267d565b15156118ac57600080fd5b6118bf6118b882611502565b33836126be565b50565b600e60009054906101000a900460ff1681565b60095481565b606481565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600e60009054906101000a900460ff16156119515761194a8383612807565b905061195e565b61195b83836129f2565b90505b92915050565b813373ffffffffffffffffffffffffffffffffffffffff1661198582611502565b73ffffffffffffffffffffffffffffffffffffffff161415156119a757600080fd5b6119b18383612c0c565b505050565b803373ffffffffffffffffffffffffffffffffffffffff166119d782611502565b73ffffffffffffffffffffffffffffffffffffffff161415156119f957600080fd5b600860009054906101000a900460ff16151515611a1557600080fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60066020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ad157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b0d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600381526020017f454d4a000000000000000000000000000000000000000000000000000000000081525081565b600f6020528060005260406000206000915090505481565b6000611c28613415565b6000806000611c35613415565b600080600080600860009054906101000a900460ff16151515611c5757600080fd5b611c608c611095565b9950600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611c9f5750893410155b1515611caa57600080fd5b60648c5111151515611cbb57600080fd5b6064604051805910611cca5750595b9080825280602002602001820160405250985060009750600096505b8b51871015611f0e578b87815181101515611cfd57fe5b906020019060200201519550611d1286612339565b1515611d1d57600080fd5b600b6000878152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611d7a57602002820191906000526020600020905b815481526020019060010190808311611d66575b50505050509450600e60009054906101000a900460ff1615611da75760018551141515611da657600080fd5b5b60648551101515611db757600080fd5b600093505b8451841015611e9857606488101515611dd457600080fd5b600092505b8851831015611e51578484815181101515611df057fe5b906020019060200201518984815181101515611e0857fe5b9060200190602002015114151515611e1f57600080fd5b60008984815181101515611e2f57fe5b906020019060200201511415611e4457611e51565b8280600101935050611dd9565b8484815181101515611e5f57fe5b906020019060200201518989815181101515611e7757fe5b90602001906020020181815250506001880197508380600101945050611dbc565b600073ffffffffffffffffffffffffffffffffffffffff16611eb987611502565b73ffffffffffffffffffffffffffffffffffffffff1614151515611edc57600080fd5b611f01611ee887611502565b600a600089815260200190815260200160002054612c8f565b8680600101975050611ce6565b611f16612d43565b9150611f228989612d65565b600b60008481526020019081526020016000209080519060200190611f48929190613429565b50611fb4600b6000848152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611fa957602002820191906000526020600020905b815481526020019060010190808311611f95575b50505050508c612df1565b1515611fbf57600080fd5b6001600c6000600b600086815260200190815260200160002060405180828054801561200a57602002820191906000526020600020905b815481526020019060010190808311611ff6575b505091505060405180910390206000191660001916815260200190815260200160002060006101000a81548160ff02191690831515021790555081600d60008d8152602001908152602001600020819055506120663383612e8b565b893411156120bb57612078348b6125c9565b90503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156120ba57600080fd5b5b600e60009054906101000a900460ff1615156120de576120dd82600954612c0c565b5b3373ffffffffffffffffffffffffffffffffffffffff167f8258990f4da6775c9379703a14a2d112f3131e6b3a3840d1f6c25ccfe1051b9d83600b60008681526020019081526020016000206040518083815260200180602001828103825283818154815260200191508054801561217557602002820191906000526020600020905b815481526020019060010190808311612161575b5050935050505060405180910390a2505050505050505050505050565b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561221f5780600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415801561228f5750803073ffffffffffffffffffffffffffffffffffffffff163110155b15612335576122a9816007546125c990919063ffffffff16565b6007819055506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561233457600080fd5b5b5050565b600080600b60008481526020019081526020016000208054905014159050919050565b600080828401905083811015151561237057fe5b8091505092915050565b600080600084141561238f57600091506123ae565b82840290508284828115156123a057fe5b041415156123aa57fe5b8091505b5092915050565b60008082848115156123c357fe5b0490508091505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561242e57600080fd5b612436612d43565b90506124428482612e8b565b60206040519081016040528082815250600b6000838152602001908152602001600020906001612473929190613476565b506124df600b60008381526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156124d457602002820191906000526020600020905b8154815260200190600101908083116124c0575b505050505083612df1565b15156124ea57600080fd5b6001600c6000602060405190810160405280858152506040518082600160200280838360005b8381101561252b578082015181840152602081019050612510565b5050505090500191505060405180910390206000191660001916815260200190815260200160002060006101000a81548160ff02191690831515021790555080600d6000848152602001908152602001600020819055507f3f5bdceccefc96a1f5b67e0c030e1f5f27d4f940582f4114ee08d3599912e216816040518082815260200191505060405180910390a16125c38184612c0c565b50505050565b60008282111515156125d757fe5b818303905092915050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b803373ffffffffffffffffffffffffffffffffffffffff1661264b82611502565b73ffffffffffffffffffffffffffffffffffffffff1614151561266d57600080fd5b6126783384846126be565b505050565b60008273ffffffffffffffffffffffffffffffffffffffff1661269f83611157565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156126fa57600080fd5b61270381611502565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561273d57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1661275d82611502565b73ffffffffffffffffffffffffffffffffffffffff1614151561277f57600080fd5b6127898382612f25565b612793838261300e565b61279d8282613296565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000612811613415565b600080606486511115151561282557600080fd5b85516040518059106128345750595b90808252806020026020018201604052509250600091505b85518210156129dc57612875868381518110151561286657fe5b90602001906020020151612339565b151561288457600093506129e9565b6001600b6000888581518110151561289857fe5b906020019060200201518152602001908152602001600020805490501415156128c457600093506129e9565b600090505b82518110156129cf57600b600087848151811015156128e457fe5b906020019060200201518152602001908152602001600020600081548110151561290a57fe5b906000526020600020900154838281518110151561292457fe5b90602001906020020151141561293d57600093506129e9565b6000838281518110151561294d57fe5b9060200190602002015114156129c257600b6000878481518110151561296f57fe5b906020019060200201518152602001908152602001600020600081548110151561299557fe5b90600052602060002090015483828151811015156129af57fe5b90602001906020020181815250506129cf565b80806001019150506128c9565b818060010192505061284c565b6129e68386612df1565b93505b50505092915050565b60006129fc613415565b6000806000612a09613415565b6000806064604051805910612a1b5750595b908082528060200260200182016040525096506000955060648a511115612a455760009750612bff565b600094505b8951851015612be9578985815181101515612a6157fe5b906020019060200201519350612a7684612339565b1515612a855760009750612bff565b600b6000858152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612ae257602002820191906000526020600020905b815481526020019060010190808311612ace575b5050505050925060648351101515612af957600080fd5b600091505b8251821015612bdc57606486101515612b1657600080fd5b600090505b8651811015612b95578282815181101515612b3257fe5b906020019060200201518782815181101515612b4a57fe5b906020019060200201511415612b635760009750612bff565b60008782815181101515612b7357fe5b906020019060200201511415612b8857612b95565b8080600101915050612b1b565b8282815181101515612ba357fe5b906020019060200201518787815181101515612bbb57fe5b90602001906020020181815250506001860195508180600101925050612afe565b8480600101955050612a4a565b612bfc612bf68888612d65565b8a612df1565b97505b5050505050505092915050565b6009548110151515612c1d57600080fd5b80600a6000848152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f372883ed096f3aca24c33c36571b41f60a645cb114b5590f319e2e1c2606db6e8383604051808381526020018281526020019250505060405180910390a25050565b612ce181600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461235c90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d398160075461235c90919063ffffffff16565b6007819055505050565b6000612d606001612d52611026565b61235c90919063ffffffff16565b905090565b612d6d613415565b612d75613415565b600083604051805910612d855750595b90808252806020026020018201604052509150600090505b83811015612de6578481815181101515612db357fe5b906020019060200201518282815181101515612dcb57fe5b90602001906020020181815250508080600101915050612d9d565b819250505092915050565b6000801515600c60008560405180828051906020019060200280838360005b83811015612e2b578082015181840152602081019050612e10565b5050505090500191505060405180910390206000191660001916815260200190815260200160002060009054906101000a900460ff161515148015612e8357506000600d600084815260200190815260200160002054145b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612ec757600080fd5b612ed18282613296565b8173ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff16612f4582611502565b73ffffffffffffffffffffffffffffffffffffffff16141515612f6757600080fd5b60006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35050565b60008060008473ffffffffffffffffffffffffffffffffffffffff1661303385611502565b73ffffffffffffffffffffffffffffffffffffffff1614151561305557600080fd5b60046000858152602001908152602001600020549250613087600161307987611580565b6125c990919063ffffffff16565b9150600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156130d557fe5b906000526020600020900154905060006001600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561318357fe5b9060005260206000209001819055506000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156131e057fe5b906000526020600020900181905550600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361324191906134c3565b506000600460008681526020019081526020016000208190555082600460008381526020019081526020016000208190555061328960016000546125c990919063ffffffff16565b6000819055505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561330557600080fd5b826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061336083611580565b9050600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816133b391906134ef565b9160005260206000209001600084909190915055508060046000848152602001908152602001600020819055506133f6600160005461235c90919063ffffffff16565b600081905550505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054828255906000526020600020908101928215613465579160200282015b82811115613464578251825591602001919060010190613449565b5b509050613472919061351b565b5090565b8280548282559060005260206000209081019282156134b2579160200282015b828111156134b1578251825591602001919060010190613496565b5b5090506134bf919061351b565b5090565b8154818355818115116134ea578183600052602060002091820191016134e9919061351b565b5b505050565b81548183558181151161351657818360005260206000209182019101613515919061351b565b5b505050565b61353d91905b80821115613539576000816000905550600101613521565b5090565b905600a165627a7a72305820141ae1431bc54f4b294a2dab8a704f005fd0a7a16714bd35243d958796a54c9c0029

Swarm Source

bzzr://141ae1431bc54f4b294a2dab8a704f005fd0a7a16714bd35243d958796a54c9c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.