ETH Price: $3,231.75 (+1.90%)

Token

Artifaqt (ATQ)
 

Overview

Max Total Supply

456 ATQ

Holders

121

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
poap.eth
Balance
3 ATQ
0xf6b6f07862a02c85628b3a9688beae07fea9c863
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Artifaqt

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 6: Artifaqt.sol
pragma solidity 0.4.24;

import "./EIP721.sol";


contract Artifaqt is EIP721 {
    address public admin;

    // Bool to pause transfers
    bool transferResumed = false;

    // Array holding the sin hashes
    bytes32[] private sins;

    // Mapping from token ID to token type
    mapping(uint256 => uint256) internal typeOfToken;

    // Cutoff minting time
    uint256 cutoffMintingTime = 1541116800;

    /// @notice Contract constructor
    /// @dev Generates the keccak256 hashes of each sin that will be used
    /// when claiming tokens. Saves the admin. Sets a name and symbol.
    constructor() public {
        // Limbo
        sins.push(keccak256("Those who were never baptised."));
        // Lust
        sins.push(keccak256("Those who gave into pleasure."));
        // Gluttony
        sins.push(keccak256("Those who indulged in excess."));
        // Avarice
        sins.push(keccak256("Those who hoard and spend wastefully."));
        // Wrath
        sins.push(keccak256("Those consumed by anger and hatred."));
        // Heresy
        sins.push(keccak256("Those who worshipped false idols."));
        // Violence
        sins.push(keccak256("Those violent against others, one’s self, and God."));
        // Fraud
        sins.push(keccak256("Those who used lies and deception for personal gain."));
        // Treachery
        sins.push(keccak256("Those who have betrayed their loved ones."));

        // Set owner
        admin = msg.sender;

        // Default name and symbol
        name = "Artifaqt";
        symbol = "ATQ";
    }

    /// @notice Claim tokens by providing the sin payload
    /// @dev Reverts unless the payload was correctly created. Reverts after the party is over and no more tokens should be created.
    /// @param _sinPayload = keccak256(keccak256(sin) + playerAddress)
    /// sin must be one of strings hashed in the constructor that the player will find scattered across the DevCon4 conference
    function claimToken(
        bytes32 _sinPayload
    ) external mintingAllowed {
        // Make sure it's the correct sin
        uint256 tokenType;
        bool found = false;
        for(uint256 i = 0; i < 9; i++) {
            if (_sinPayload == keccak256(abi.encodePacked(sins[i], msg.sender))) {
                tokenType = i;
                found = true;
                break;
            }
        }
        require(found == true);

        // Make sure the user does not have this type of token
        require(ownerHasTokenType(msg.sender, tokenType) == false);

        // Create and add token
        uint256 tokenId = totalSupply();
        addToken(msg.sender, tokenId, tokenType);

        // Emit create event
        emit Transfer(0x0, msg.sender, tokenId);
    }

    /// @notice The admin can generate tokens for players
    /// @dev Reverts unless the user already has the token type. Reverts unless the minting happens withing the minting allowed time period.
    /// @param _to The player's address
    /// @param _tokenType A number from 0 to 8 representing the sin type
    function mintToken(
        address _to,
        uint256 _tokenType
    ) external onlyAdmin mintingAllowed {
        // Create and add token
        uint256 tokenId = totalSupply();
        addToken(_to, tokenId, _tokenType);

        // Emit create event
        emit Transfer(0x0, _to, tokenId);
    }

    /// @notice Returns the token id, owner and type
    /// @dev Throws unless _tokenId exists
    /// @param _tokenId The token by id
    /// @return
    /// - token index
    /// - owner of token
    /// - type of token
    function getToken(
        uint256 _tokenId
    ) external view returns (uint256, address, uint256) {
        return (
            allTokensIndex[_tokenId],
            ownerOfToken[_tokenId],
            typeOfToken[_tokenId]
        );
    }

    /// @notice Returns the claimed tokens for player
    /// @dev Returns an empty array if player does not have any claimed tokens
    /// @param _player The player's address
    function getTokenTypes(
        address _player
    ) external view returns (uint256[]) {
        uint256[] memory claimedTokens = new uint256[](ownedTokens[_player].length);

        for (uint256 i = 0; i < ownedTokens[_player].length; i++) {
            claimedTokens[i] = typeOfToken[ownedTokens[_player][i]];
        }

        return claimedTokens;
    }

    // TODO: Do not allow any kind of transfers if transfer is paused
    /// @notice Transfers the ownership of a token
    /// @dev Calls the parent function if transfers are not paused
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(
        address _from, 
        address _to, 
        uint256 _tokenId, 
        bytes data
    ) public payable transferAllowed {
        super.safeTransferFrom(_from, _to, _tokenId, data);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Calls the parent function if transfers are not paused
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(
        address _from, 
        address _to, 
        uint256 _tokenId
    ) public payable transferAllowed {
        super.safeTransferFrom(_from, _to, _tokenId);
    }

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Calls the parent function if transfers are not paused
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(
        address _from, 
        address _to, 
        uint256 _tokenId
    ) public payable transferAllowed {
        super.transferFrom(_from, _to, _tokenId);
    }

    /// @notice Enables or disables transfers
    /// @dev Set to `true` to enable transfers or `false` to disable transfers. 
    /// If it is set to `false` all functions that transfer tokens are paused and will revert.
    /// Functions that approve transfers (`approve()` and `setTransferForAll()`) still work 
    /// because they do not transfer tokens immediately.
    /// @param _resume This should be set to `true` if transfers should be enabled, `false` otherwise
    function allowTransfer(bool _resume) public onlyAdmin {
        transferResumed = _resume;
    }

    /// @notice Returns true of the `_player` has the requested `_tokenType`
    /// @dev
    /// @param _player The player's address
    /// @param _tokenType A number from 0 to 8 representing the sin type
    function ownerHasTokenType(
        address _player,
        uint256 _tokenType
    ) internal view returns (bool) {
        for (uint256 i = 0; i < ownedTokens[_player].length; i++) {
            if (typeOfToken[ownedTokens[_player][i]] == _tokenType) {
                return true;
            }
        }
        return false;
    }

    /// @notice Adds a token for the player
    /// @dev Calls the `super.addToken(address _to, uint256 _tokenId)` method and
    /// saves the token type also. The `_tokenId` must not already exist.
    /// @param _to The player's address
    /// @param _tokenId The new token id
    /// @param _tokenType A number from 0 to 8 representing the sin type
    function addToken(
        address _to,
        uint256 _tokenId,
        uint256 _tokenType
    ) internal {
        super.addToken(_to, _tokenId);

        // Save token type
        typeOfToken[_tokenId] = _tokenType;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }

    modifier mintingAllowed() {
        require(block.timestamp <= cutoffMintingTime);
        _;
    }

    modifier transferAllowed() {
        require(transferResumed);
        _;
    }
}

File 2 of 6: EIP721.sol
pragma solidity ^0.4.24;
import "./EIP721Interface.sol";
import "./EIP721MetadataInterface.sol";
import "./EIP721EnumerableInterface.sol";
import "./EIP721TokenReceiverInterface.sol";

/*
This is a full implementation of all ERC721's features.
Influenced by OpenZeppelin's implementation with some stylistic changes.
https://github.com/OpenZeppelin/zeppelin-solidity/tree/master/contracts/token/ERC721
*/

contract EIP721 is EIP721Interface, EIP721MetadataInterface, EIP721EnumerableInterface, ERC165Interface {
    string public name;
    string public symbol;

    // all tokens
    uint256[] internal allTokens;
    // mapping of token IDs to its index in all Tokens array.
    mapping(uint256 => uint256) internal allTokensIndex;
    // Array of tokens owned by a specific owner
    mapping(address => uint256[]) internal ownedTokens;
    // Mapping from token ID to owner
    mapping(uint256 => address) internal ownerOfToken;
    // Mapping of the token ID to where it is in the owner's array.
    mapping(uint256 => uint256) internal ownedTokensIndex;

    // Mapping of a token to a specifically approved owner.
    mapping(uint256 => address) internal approvedOwnerOfToken;

    // An operator is allowed to manage all assets of another owner.
    mapping(address => mapping (address => bool)) internal operators;

    mapping(uint256 => string) internal tokenURIs;

    bytes4 internal constant ERC721_BASE_INTERFACE_SIGNATURE = 0x80ac58cd;
    bytes4 internal constant ERC721_METADATA_INTERFACE_SIGNATURE = 0x5b5e139f;
    bytes4 internal constant ERC721_ENUMERABLE_INTERFACE_SIGNATURE = 0x780e9d63;
    bytes4 internal constant ONERC721RECEIVED_FUNCTION_SIGNATURE = 0x150b7a02;

    /* Modifiers */
    modifier tokenExists(uint256 _tokenId) {
        require(ownerOfToken[_tokenId] != 0);
        _;
    }

    // checks: is the owner of the token == msg.sender?
    // OR has the owner of the token granted msg.sender access to operate?
    modifier allowedToOperate(uint256 _tokenId) {
        require(checkIfAllowedToOperate(_tokenId));
        _;
    }

    modifier allowedToTransfer(address _from, address _to, uint256 _tokenId) {
        require(checkIfAllowedToOperate(_tokenId) || approvedOwnerOfToken[_tokenId] == msg.sender);
        require(ownerOfToken[_tokenId] == _from);
        require(_to != 0); //not allowed to burn in transfer method
        _;
    }

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) public payable
    tokenExists(_tokenId)
    allowedToTransfer(_from, _to, _tokenId) {
        //transfer token
        settleTransfer(_from, _to, _tokenId);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) public payable
    tokenExists(_tokenId)
    allowedToTransfer(_from, _to, _tokenId) {
        settleTransfer(_from, _to, _tokenId);

        // check if a smart contract
        uint256 size;
        assembly { size := extcodesize(_to) }  // solhint-disable-line no-inline-assembly
        if (size > 0) {
            // call on onERC721Received.
            require(EIP721TokenReceiverInterface(_to).onERC721Received(msg.sender, _from, _tokenId, data) == ONERC721RECEIVED_FUNCTION_SIGNATURE);
        }
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to ""
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public payable
    tokenExists(_tokenId)
    allowedToTransfer(_from, _to, _tokenId) {
        settleTransfer(_from, _to, _tokenId);

        // check if a smart contract
        uint256 size;
        assembly { size := extcodesize(_to) }  // solhint-disable-line no-inline-assembly
        if (size > 0) {
            // call on onERC721Received.
            require(EIP721TokenReceiverInterface(_to).onERC721Received(msg.sender, _from, _tokenId, "") == ONERC721RECEIVED_FUNCTION_SIGNATURE);
        }
    }

    /// @notice Change or reaffirm the approved address for an NFT.
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable
    tokenExists(_tokenId)
    allowedToOperate(_tokenId) {
        address owner = ownerOfToken[_tokenId];
        internalApprove(owner, _approved, _tokenId);
    }

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets.
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators.
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external {
        require(_operator != msg.sender); // can't make oneself an operator
        operators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /* public View Functions */
    /// @notice Count NFTs tracked by this contract
    /// @return A count of valid NFTs tracked by this contract, where each one of
    ///  them has an assigned and queryable owner not equal to the zero address
    function totalSupply() public view returns (uint256) {
        return allTokens.length;
    }

    /// @notice Find the owner of an NFT
    /// @param _tokenId The identifier for an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view
    tokenExists(_tokenId) returns (address) {
        return ownerOfToken[_tokenId];
    }

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256) {
        require(_index < allTokens.length);
        return allTokens[_index];
    }

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view
    tokenExists(_tokenId) returns (uint256 _tokenId) {
        require(_index < ownedTokens[_owner].length);
        return ownedTokens[_owner][_index];
    }

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != 0);
        return ownedTokens[_owner].length;
    }

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT
    /// @param _tokenId The NFT to find the approved address for
    // todo: The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view
    tokenExists(_tokenId) returns (address) {
        return approvedOwnerOfToken[_tokenId];
    }

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        return operators[_owner][_operator];
    }

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string) {
        return tokenURIs[_tokenId];
    }

    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    /// `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool) {

        if (interfaceID == ERC721_BASE_INTERFACE_SIGNATURE ||
        interfaceID == ERC721_METADATA_INTERFACE_SIGNATURE ||
        interfaceID == ERC721_ENUMERABLE_INTERFACE_SIGNATURE) {
            return true;
        } else { return false; }
    }

    /* -- Internal Functions -- */
    function checkIfAllowedToOperate(uint256 _tokenId) internal view returns (bool) {
        return ownerOfToken[_tokenId] == msg.sender || operators[ownerOfToken[_tokenId]][msg.sender];
    }

    function internalApprove(address _owner, address _approved, uint256 _tokenId) internal {
        require(_approved != _owner); //can't approve to owner to itself

        // Note: the following code is equivalent to: require(getApproved(_tokenId) != 0) || _approved != 0);
        // However: I found the following easier to read & understand.
        if (approvedOwnerOfToken[_tokenId] == 0 && _approved == 0) {
            revert(); // add reason for revert?
        } else {
            approvedOwnerOfToken[_tokenId] = _approved;
            emit Approval(_owner, _approved, _tokenId);
        }
    }

    function settleTransfer(address _from, address _to, uint256 _tokenId) internal {
        //clear pending approvals if there are any
        if (approvedOwnerOfToken[_tokenId] != 0) {
            internalApprove(_from, 0, _tokenId);
        }

        removeToken(_from, _tokenId);
        addToken(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }

    function addToken(address _to, uint256 _tokenId) internal {
        // add new token to all tokens
        allTokens.push(_tokenId);
        // add new token to index of all tokens.
        allTokensIndex[_tokenId] = allTokens.length-1;

        // set token to be owned by address _to
        ownerOfToken[_tokenId] = _to;
        // add that token to an array keeping track of tokens owned by that address
        ownedTokens[_to].push(_tokenId);
        // add newly pushed to index.
        ownedTokensIndex[_tokenId] = ownedTokens[_to].length-1;
    }

    function removeToken(address _from, uint256 _tokenId) internal {

        // remove token from allTokens array.
        uint256 allIndex = allTokensIndex[_tokenId];
        uint256 allTokensLength = allTokens.length;
        //1) Put last tokenID into index of tokenID to be removed.
        allTokens[allIndex] = allTokens[allTokensLength - 1];
        //2) Take last tokenID that has been moved to the removed token & update its new index
        allTokensIndex[allTokens[allTokensLength-1]] = allIndex;
        //3) delete last item (since it's now a duplicate)
        delete allTokens[allTokensLength-1];
        //4) reduce length of array
        allTokens.length -= 1;

        // remove token from owner array.
        // get the index of where this token is in the owner's array
        uint256 ownerIndex = ownedTokensIndex[_tokenId];
        uint256 ownerLength = ownedTokens[_from].length;
        /* Remove Token From Index */
        //1) Put last tokenID into index of token to be removed.
        ownedTokens[_from][ownerIndex] = ownedTokens[_from][ownerLength-1];
        //2) Take last item that has been moved to the removed token & update its index
        ownedTokensIndex[ownedTokens[_from][ownerLength-1]] = ownerIndex;
        //3) delete last item (since it's now a duplicate)
        delete ownedTokens[_from][ownerLength-1];
        //4) reduce length of array
        ownedTokens[_from].length -= 1;

        delete ownerOfToken[_tokenId];
    }
}

File 3 of 6: EIP721EnumerableInterface.sol
pragma solidity ^0.4.24;


/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x780e9d63
interface EIP721EnumerableInterface {
    /// @notice Count NFTs tracked by this contract
    /// @return A count of valid NFTs tracked by this contract, where each one of
    ///  them has an assigned and queryable owner not equal to the zero address
    function totalSupply() external view returns (uint256);

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256);

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _tokenId);
}

File 4 of 6: EIP721Interface.sol
pragma solidity ^0.4.24;


/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x6466353c
interface EIP721Interface {

    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) public payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to ""
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) public payable;

    /// @notice Change or reaffirm the approved address for an NFT.
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets.
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators.
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @param _tokenId The identifier for an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

}


interface ERC165Interface {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

File 5 of 6: EIP721MetadataInterface.sol
pragma solidity ^0.4.24;


/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f
interface EIP721MetadataInterface {
    /// @notice A descriptive name for a collection of NFTs in this contract
    // function name() external view returns (string _name);

    /// @notice An abbreviated name for NFTs in this contract
    // function symbol() external view returns (string _symbol);

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string);
}

File 6 of 6: EIP721TokenReceiverInterface.sol
pragma solidity ^0.4.24;


/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface EIP721TokenReceiverInterface {
    /// @notice Handle the receipt of an NFT
    /// Note: the application will get the prior owner of the token
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenType","type":"uint256"}],"name":"mintToken","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":"_player","type":"address"}],"name":"getTokenTypes","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_sinPayload","type":"bytes32"}],"name":"claimToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_resume","type":"bool"}],"name":"allowTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getToken","outputs":[{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

6080604052600a805460a060020a60ff0219169055635bdb9380600d553480156200002957600080fd5b50604080517f54686f73652077686f2077657265206e657665722062617074697365642e00008152815190819003601e018120600b80546001818101835560008381527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9928301949094557f54686f73652077686f206761766520696e746f20706c6561737572652e0000008552855194859003601d9081018620845480840186558587528401557f54686f73652077686f20696e64756c67656420696e206578636573732e0000008652865195869003018520835480830185558486528301557f54686f73652077686f20686f61726420616e64207370656e642077617374656685527f756c6c792e0000000000000000000000000000000000000000000000000000006020868101919091528651958690036025018620845480840186558587528401557f54686f736520636f6e73756d656420627920616e67657220616e64206861747286527f65642e0000000000000000000000000000000000000000000000000000000000868201528651958690036023018620845480840186558587528401557f54686f73652077686f20776f72736869707065642066616c73652069646f6c7386527f2e00000000000000000000000000000000000000000000000000000000000000868201528651958690036021018620845480840186558587528401557f54686f73652076696f6c656e7420616761696e7374206f74686572732c206f6e86527f65e28099732073656c662c20616e6420476f642e0000000000000000000000008682015286519586900360349081018720855480850187558688528501557f54686f73652077686f2075736564206c69657320616e6420646563657074696f87527f6e20666f7220706572736f6e616c206761696e2e00000000000000000000000087830152875196879003018620845480840186558587528401557f54686f73652077686f2068617665206265747261796564207468656972206c6f86527f766564206f6e65732e000000000000000000000000000000000000000000000086820152865195869003602901862084549283018555938552910191909155600a8054600160a060020a0319163317905582840190935260088083527f417274696661717400000000000000000000000000000000000000000000000092909301918252620003a592909190620003f3565b506040805180820190915260038082527f41545100000000000000000000000000000000000000000000000000000000006020909201918252620003ec91600191620003f3565b5062000498565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200043657805160ff191683800117855562000466565b8280016001018555821562000466579182015b828111156200046657825182559160200191906001019062000449565b506200047492915062000478565b5090565b6200049591905b808211156200047457600081556001016200047f565b90565b61182c80620004a86000396000f3006080604052600436106101275763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461012c57806306fdde0314610177578063081812fc14610201578063095ea7b31461023557806318160ddd1461024e57806323b872dd146102755780632f745c591461029257806342842e0e146102b65780634f6ccce7146102d35780636352211e146102eb57806370a082311461030357806379c650681461032457806395d89b411461034857806397de8db01461035d578063a22cb465146103ce578063a5bfa9a9146103f4578063b88d4fde1461040c578063c87b56dd1461046e578063d4cab60d14610486578063e4b50cb8146104a0578063e985e9c5146104de578063f851a44014610505575b600080fd5b34801561013857600080fd5b506101637bffffffffffffffffffffffffffffffffffffffffffffffffffffffff196004351661051a565b604080519115158252519081900360200190f35b34801561018357600080fd5b5061018c610606565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101c65781810151838201526020016101ae565b50505050905090810190601f1680156101f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561020d57600080fd5b50610219600435610694565b60408051600160a060020a039092168252519081900360200190f35b61024c600160a060020a03600435166024356106d6565b005b34801561025a57600080fd5b5061026361073c565b60408051918252519081900360200190f35b61024c600160a060020a0360043581169060243516604435610743565b34801561029e57600080fd5b50610263600160a060020a036004351660243561077c565b61024c600160a060020a036004358116906024351660443561081b565b3480156102df57600080fd5b5061026360043561084f565b3480156102f757600080fd5b50610219600435610880565b34801561030f57600080fd5b50610263600160a060020a03600435166108c2565b34801561033057600080fd5b5061024c600160a060020a03600435166024356108f5565b34801561035457600080fd5b5061018c610971565b34801561036957600080fd5b5061037e600160a060020a03600435166109cb565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103ba5781810151838201526020016103a2565b505050509050019250505060405180910390f35b3480156103da57600080fd5b5061024c600160a060020a03600435166024351515610a9f565b34801561040057600080fd5b5061024c600435610b23565b604080516020601f60643560048181013592830184900484028501840190955281845261024c94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750610c819650505050505050565b34801561047a57600080fd5b5061018c600435610cbc565b34801561049257600080fd5b5061024c6004351515610d5d565b3480156104ac57600080fd5b506104b8600435610dbe565b60408051938452600160a060020a03909216602084015282820152519081900360600190f35b3480156104ea57600080fd5b50610163600160a060020a0360043581169060243516610df1565b34801561051157600080fd5b50610219610e1f565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806105a757507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105f057507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f780e9d6300000000000000000000000000000000000000000000000000000000145b156105fd57506001610601565b5060005b919050565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b505050505081565b6000818152600560205260408120548290600160a060020a031615156106b957600080fd5b5050600090815260076020526040902054600160a060020a031690565b6000818152600560205260408120548290600160a060020a031615156106fb57600080fd5b8261070581610e2e565b151561071057600080fd5b600084815260056020526040902054600160a060020a03169250610735838686610e85565b5050505050565b6002545b90565b600a5474010000000000000000000000000000000000000000900460ff16151561076c57600080fd5b610777838383610f3d565b505050565b600080805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc548190600160a060020a031615156107be57600080fd5b600160a060020a03841660009081526004602052604090205483106107e257600080fd5b600160a060020a038416600090815260046020526040902080548490811061080657fe5b906000526020600020015491505b5092915050565b600a5474010000000000000000000000000000000000000000900460ff16151561084457600080fd5b610777838383610fe9565b600254600090821061086057600080fd5b600280548390811061086e57fe5b90600052602060002001549050919050565b6000818152600560205260408120548290600160a060020a031615156108a557600080fd5b5050600090815260056020526040902054600160a060020a031690565b6000600160a060020a03821615156108d957600080fd5b50600160a060020a031660009081526004602052604090205490565b600a54600090600160a060020a0316331461090f57600080fd5b600d5442111561091e57600080fd5b61092661073c565b905061093383828461117c565b8083600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561068c5780601f106106615761010080835404028352916020019161068c565b600160a060020a03811660009081526004602090815260408083205481518181528184028101909301909152606092839290918015610a14578160200160208202803883390190505b509150600090505b600160a060020a03841660009081526004602052604090205481101561081457600160a060020a03841660009081526004602052604081208054600c92919084908110610a6557fe5b90600052602060002001548152602001908152602001600020548282815181101515610a8d57fe5b60209081029091010152600101610a1c565b600160a060020a038216331415610ab557600080fd5b336000818152600860209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600080600080600d544211151515610b3a57600080fd5b60009250600091505b6009821015610c1357600b805483908110610b5a57fe5b6000918252602091829020015460408051808401929092526c010000000000000000000000003302828201528051603481840301815260549092019081905281519192909182918401908083835b60208310610bc75780518252601f199092019160209182019101610ba8565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091208814159250610c089150505781935060019250610c13565b600190910190610b43565b600183151514610c2257600080fd5b610c2c3385611199565b15610c3657600080fd5b610c3e61073c565b9050610c4b33828661117c565b604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050505050565b600a5474010000000000000000000000000000000000000000900460ff161515610caa57600080fd5b610cb684848484611223565b50505050565b60008181526009602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d515780601f10610d2657610100808354040283529160200191610d51565b820191906000526020600020905b815481529060010190602001808311610d3457829003601f168201915b50505050509050919050565b600a54600160a060020a03163314610d7457600080fd5b600a805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000908152600360209081526040808320546005835281842054600c9093529220549192600160a060020a039091169190565b600160a060020a03918216600090815260086020908152604080832093909416825291909152205460ff1690565b600a54600160a060020a031681565b600081815260056020526040812054600160a060020a0316331480610e7f5750600082815260056020908152604080832054600160a060020a031683526008825280832033845290915290205460ff165b92915050565b600160a060020a038281169084161415610e9e57600080fd5b600081815260076020526040902054600160a060020a0316158015610eca5750600160a060020a038216155b15610ed457600080fd5b600081815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591518493918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600560205260409020548190600160a060020a03161515610f6257600080fd5b838383610f6e81610e2e565b80610f8f5750600081815260076020526040902054600160a060020a031633145b1515610f9a57600080fd5b600081815260056020526040902054600160a060020a03848116911614610fc057600080fd5b600160a060020a0382161515610fd557600080fd5b610fe0878787611476565b50505050505050565b6000818152600560205260408120548290600160a060020a0316151561100e57600080fd5b84848461101a81610e2e565b8061103b5750600081815260076020526040902054600160a060020a031633145b151561104657600080fd5b600081815260056020526040902054600160a060020a0384811691161461106c57600080fd5b600160a060020a038216151561108157600080fd5b61108c888888611476565b863b9450600085111561117257604080517f150b7a0200000000000000000000000000000000000000000000000000000000808252336004830152600160a060020a038b81166024840152604483018a90526080606484015260006084840181905293519193908b169263150b7a029260c48083019360209383900390910190829087803b15801561111d57600080fd5b505af1158015611131573d6000803e3d6000fd5b505050506040513d602081101561114757600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461117257600080fd5b5050505050505050565b61118683836114f9565b6000918252600c60205260409091205550565b6000805b600160a060020a03841660009081526004602052604090205481101561121957600160a060020a038416600090815260046020526040812080548592600c929091859081106111e857fe5b906000526020600020015481526020019081526020016000205414156112115760019150610814565b60010161119d565b5060009392505050565b6000828152600560205260408120548390600160a060020a0316151561124857600080fd5b85858561125481610e2e565b806112755750600081815260076020526040902054600160a060020a031633145b151561128057600080fd5b600081815260056020526040902054600160a060020a038481169116146112a657600080fd5b600160a060020a03821615156112bb57600080fd5b6112c6898989611476565b873b9450600085111561146b5763150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191688600160a060020a031663150b7a02338c8b8b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113c75781810151838201526020016113af565b50505050905090810190601f1680156113f45780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561141657600080fd5b505af115801561142a573d6000803e3d6000fd5b505050506040513d602081101561144057600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461146b57600080fd5b505050505050505050565b600081815260076020526040902054600160a060020a03161561149f5761149f83600083610e85565b6114a983826115a7565b6114b382826114f9565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60028054600181810183557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101839055905460008381526003602090815260408083206000199485019055600582528083208054600160a060020a0390981673ffffffffffffffffffffffffffffffffffffffff199098168817905595825260048152858220805494850181558083528183209094018590559254938152600690925292902091019055565b60008181526003602052604081205460028054919290819060001984018481106115cd57fe5b90600052602060002001546002858154811015156115e757fe5b9060005260206000200181905550836003600060026001870381548110151561160c57fe5b906000526020600020015481526020019081526020016000208190555060026001840381548110151561163b57fe5b600091825260208220015560028054600019019061165990826117c3565b505050600083815260066020908152604080832054600160a060020a03881684526004909252909120805490600019820182811061169357fe5b6000918252602080832090910154600160a060020a0389168352600490915260409091208054849081106116c357fe5b90600052602060002001819055508160066000600460008a600160a060020a0316600160a060020a031681526020019081526020016000206001850381548110151561170b57fe5b90600052602060002001548152602001908152602001600020819055506004600087600160a060020a0316600160a060020a031681526020019081526020016000206001820381548110151561175d57fe5b60009182526020808320909101829055600160a060020a038816825260049052604090208054600019019061179290826117c3565b50505060009283525050600560205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b8154818355818111156107775760008381526020902061077791810190830161074091905b808211156117fc57600081556001016117e8565b50905600a165627a7a72305820bc1647cdcfd7f6c4864a660d0ae57414fe906c94156a590b492a22d7731b60ab0029

Deployed Bytecode

0x6080604052600436106101275763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a7811461012c57806306fdde0314610177578063081812fc14610201578063095ea7b31461023557806318160ddd1461024e57806323b872dd146102755780632f745c591461029257806342842e0e146102b65780634f6ccce7146102d35780636352211e146102eb57806370a082311461030357806379c650681461032457806395d89b411461034857806397de8db01461035d578063a22cb465146103ce578063a5bfa9a9146103f4578063b88d4fde1461040c578063c87b56dd1461046e578063d4cab60d14610486578063e4b50cb8146104a0578063e985e9c5146104de578063f851a44014610505575b600080fd5b34801561013857600080fd5b506101637bffffffffffffffffffffffffffffffffffffffffffffffffffffffff196004351661051a565b604080519115158252519081900360200190f35b34801561018357600080fd5b5061018c610606565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101c65781810151838201526020016101ae565b50505050905090810190601f1680156101f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561020d57600080fd5b50610219600435610694565b60408051600160a060020a039092168252519081900360200190f35b61024c600160a060020a03600435166024356106d6565b005b34801561025a57600080fd5b5061026361073c565b60408051918252519081900360200190f35b61024c600160a060020a0360043581169060243516604435610743565b34801561029e57600080fd5b50610263600160a060020a036004351660243561077c565b61024c600160a060020a036004358116906024351660443561081b565b3480156102df57600080fd5b5061026360043561084f565b3480156102f757600080fd5b50610219600435610880565b34801561030f57600080fd5b50610263600160a060020a03600435166108c2565b34801561033057600080fd5b5061024c600160a060020a03600435166024356108f5565b34801561035457600080fd5b5061018c610971565b34801561036957600080fd5b5061037e600160a060020a03600435166109cb565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103ba5781810151838201526020016103a2565b505050509050019250505060405180910390f35b3480156103da57600080fd5b5061024c600160a060020a03600435166024351515610a9f565b34801561040057600080fd5b5061024c600435610b23565b604080516020601f60643560048181013592830184900484028501840190955281845261024c94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750610c819650505050505050565b34801561047a57600080fd5b5061018c600435610cbc565b34801561049257600080fd5b5061024c6004351515610d5d565b3480156104ac57600080fd5b506104b8600435610dbe565b60408051938452600160a060020a03909216602084015282820152519081900360600190f35b3480156104ea57600080fd5b50610163600160a060020a0360043581169060243516610df1565b34801561051157600080fd5b50610219610e1f565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806105a757507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105f057507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982167f780e9d6300000000000000000000000000000000000000000000000000000000145b156105fd57506001610601565b5060005b919050565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b505050505081565b6000818152600560205260408120548290600160a060020a031615156106b957600080fd5b5050600090815260076020526040902054600160a060020a031690565b6000818152600560205260408120548290600160a060020a031615156106fb57600080fd5b8261070581610e2e565b151561071057600080fd5b600084815260056020526040902054600160a060020a03169250610735838686610e85565b5050505050565b6002545b90565b600a5474010000000000000000000000000000000000000000900460ff16151561076c57600080fd5b610777838383610f3d565b505050565b600080805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc548190600160a060020a031615156107be57600080fd5b600160a060020a03841660009081526004602052604090205483106107e257600080fd5b600160a060020a038416600090815260046020526040902080548490811061080657fe5b906000526020600020015491505b5092915050565b600a5474010000000000000000000000000000000000000000900460ff16151561084457600080fd5b610777838383610fe9565b600254600090821061086057600080fd5b600280548390811061086e57fe5b90600052602060002001549050919050565b6000818152600560205260408120548290600160a060020a031615156108a557600080fd5b5050600090815260056020526040902054600160a060020a031690565b6000600160a060020a03821615156108d957600080fd5b50600160a060020a031660009081526004602052604090205490565b600a54600090600160a060020a0316331461090f57600080fd5b600d5442111561091e57600080fd5b61092661073c565b905061093383828461117c565b8083600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561068c5780601f106106615761010080835404028352916020019161068c565b600160a060020a03811660009081526004602090815260408083205481518181528184028101909301909152606092839290918015610a14578160200160208202803883390190505b509150600090505b600160a060020a03841660009081526004602052604090205481101561081457600160a060020a03841660009081526004602052604081208054600c92919084908110610a6557fe5b90600052602060002001548152602001908152602001600020548282815181101515610a8d57fe5b60209081029091010152600101610a1c565b600160a060020a038216331415610ab557600080fd5b336000818152600860209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600080600080600d544211151515610b3a57600080fd5b60009250600091505b6009821015610c1357600b805483908110610b5a57fe5b6000918252602091829020015460408051808401929092526c010000000000000000000000003302828201528051603481840301815260549092019081905281519192909182918401908083835b60208310610bc75780518252601f199092019160209182019101610ba8565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091208814159250610c089150505781935060019250610c13565b600190910190610b43565b600183151514610c2257600080fd5b610c2c3385611199565b15610c3657600080fd5b610c3e61073c565b9050610c4b33828661117c565b604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050505050565b600a5474010000000000000000000000000000000000000000900460ff161515610caa57600080fd5b610cb684848484611223565b50505050565b60008181526009602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d515780601f10610d2657610100808354040283529160200191610d51565b820191906000526020600020905b815481529060010190602001808311610d3457829003601f168201915b50505050509050919050565b600a54600160a060020a03163314610d7457600080fd5b600a805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000908152600360209081526040808320546005835281842054600c9093529220549192600160a060020a039091169190565b600160a060020a03918216600090815260086020908152604080832093909416825291909152205460ff1690565b600a54600160a060020a031681565b600081815260056020526040812054600160a060020a0316331480610e7f5750600082815260056020908152604080832054600160a060020a031683526008825280832033845290915290205460ff165b92915050565b600160a060020a038281169084161415610e9e57600080fd5b600081815260076020526040902054600160a060020a0316158015610eca5750600160a060020a038216155b15610ed457600080fd5b600081815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591518493918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600560205260409020548190600160a060020a03161515610f6257600080fd5b838383610f6e81610e2e565b80610f8f5750600081815260076020526040902054600160a060020a031633145b1515610f9a57600080fd5b600081815260056020526040902054600160a060020a03848116911614610fc057600080fd5b600160a060020a0382161515610fd557600080fd5b610fe0878787611476565b50505050505050565b6000818152600560205260408120548290600160a060020a0316151561100e57600080fd5b84848461101a81610e2e565b8061103b5750600081815260076020526040902054600160a060020a031633145b151561104657600080fd5b600081815260056020526040902054600160a060020a0384811691161461106c57600080fd5b600160a060020a038216151561108157600080fd5b61108c888888611476565b863b9450600085111561117257604080517f150b7a0200000000000000000000000000000000000000000000000000000000808252336004830152600160a060020a038b81166024840152604483018a90526080606484015260006084840181905293519193908b169263150b7a029260c48083019360209383900390910190829087803b15801561111d57600080fd5b505af1158015611131573d6000803e3d6000fd5b505050506040513d602081101561114757600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461117257600080fd5b5050505050505050565b61118683836114f9565b6000918252600c60205260409091205550565b6000805b600160a060020a03841660009081526004602052604090205481101561121957600160a060020a038416600090815260046020526040812080548592600c929091859081106111e857fe5b906000526020600020015481526020019081526020016000205414156112115760019150610814565b60010161119d565b5060009392505050565b6000828152600560205260408120548390600160a060020a0316151561124857600080fd5b85858561125481610e2e565b806112755750600081815260076020526040902054600160a060020a031633145b151561128057600080fd5b600081815260056020526040902054600160a060020a038481169116146112a657600080fd5b600160a060020a03821615156112bb57600080fd5b6112c6898989611476565b873b9450600085111561146b5763150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191688600160a060020a031663150b7a02338c8b8b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113c75781810151838201526020016113af565b50505050905090810190601f1680156113f45780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561141657600080fd5b505af115801561142a573d6000803e3d6000fd5b505050506040513d602081101561144057600080fd5b50517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461146b57600080fd5b505050505050505050565b600081815260076020526040902054600160a060020a03161561149f5761149f83600083610e85565b6114a983826115a7565b6114b382826114f9565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60028054600181810183557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101839055905460008381526003602090815260408083206000199485019055600582528083208054600160a060020a0390981673ffffffffffffffffffffffffffffffffffffffff199098168817905595825260048152858220805494850181558083528183209094018590559254938152600690925292902091019055565b60008181526003602052604081205460028054919290819060001984018481106115cd57fe5b90600052602060002001546002858154811015156115e757fe5b9060005260206000200181905550836003600060026001870381548110151561160c57fe5b906000526020600020015481526020019081526020016000208190555060026001840381548110151561163b57fe5b600091825260208220015560028054600019019061165990826117c3565b505050600083815260066020908152604080832054600160a060020a03881684526004909252909120805490600019820182811061169357fe5b6000918252602080832090910154600160a060020a0389168352600490915260409091208054849081106116c357fe5b90600052602060002001819055508160066000600460008a600160a060020a0316600160a060020a031681526020019081526020016000206001850381548110151561170b57fe5b90600052602060002001548152602001908152602001600020819055506004600087600160a060020a0316600160a060020a031681526020019081526020016000206001820381548110151561175d57fe5b60009182526020808320909101829055600160a060020a038816825260049052604090208054600019019061179290826117c3565b50505060009283525050600560205260409020805473ffffffffffffffffffffffffffffffffffffffff1916905550565b8154818355818111156107775760008381526020902061077791810190830161074091905b808211156117fc57600081556001016117e8565b50905600a165627a7a72305820bc1647cdcfd7f6c4864a660d0ae57414fe906c94156a590b492a22d7731b60ab0029

Deployed Bytecode Sourcemap

50:7994:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10780:330:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10780:330:1;-1:-1:-1;;10780:330:1;;;;;;;;;;;;;;;;;;;;;;;516:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;516:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;516:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9420:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9420:151:1;;;;;;;;;-1:-1:-1;;;;;9420:151:1;;;;;;;;;;;;;;5947:236;;-1:-1:-1;;;;;5947:236:1;;;;;;;;;7103:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7103:93:1;;;;;;;;;;;;;;;;;;;;5871:188:0;;-1:-1:-1;;;;;5871:188:0;;;;;;;;;;;;8443:233:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8443:233:1;-1:-1:-1;;;;;8443:233:1;;;;;;;5295:196:0;;-1:-1:-1;;;;;5295:196:0;;;;;;;;;;;;7843:155:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7843:155:1;;;;;7454:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7454:139:1;;;;;9006:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9006:147:1;-1:-1:-1;;;;;9006:147:1;;;;;3063:304:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3063:304:0;-1:-1:-1;;;;;3063:304:0;;;;;;;540:20:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;540:20:1;;;;4022:359:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4022:359:0;-1:-1:-1;;;;;4022:359:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4022:359:0;;;;;;;;;;;;;;;;;6580:271:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6580:271:1;-1:-1:-1;;;;;6580:271:1;;;;;;;;;1963:782:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1963:782:0;;;;;4786:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4786:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4786:223:0;;-1:-1:-1;4786:223:0;;-1:-1:-1;;;;;;;4786:223:0;10287:110:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10287:110:1;;;;;6539:96:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6539:96:0;;;;;;;3596:243;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3596:243:0;;;;;;;;;;;;-1:-1:-1;;;;;3596:243:0;;;;;;;;;;;;;;;;;;;;9872:142:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9872:142:1;-1:-1:-1;;;;;9872:142:1;;;;;;;;;;84:20:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84:20:0;;;;10780:330:1;10850:4;-1:-1:-1;;10871:46:1;;10886:31;10871:46;;:108;;-1:-1:-1;;;10929:50:1;;10944:35;10929:50;10871:108;:172;;;-1:-1:-1;;;10991:52:1;;11006:37;10991:52;10871:172;10867:237;;;-1:-1:-1;11066:4:1;11059:11;;10867:237;-1:-1:-1;11096:5:1;10867:237;10780:330;;;:::o;516:18::-;;;;;;;;;;;;;;;-1:-1:-1;;516:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9420:151::-;9508:7;1772:22;;;:12;:22;;;;;;9489:8;;-1:-1:-1;;;;;1772:22:1;:27;;1764:36;;;;;;-1:-1:-1;;9534:30:1;;;;:20;:30;;;;;;-1:-1:-1;;;;;9534:30:1;;9420:151::o;5947:236::-;6085:13;1772:22;;;:12;:22;;;;;;6034:8;;-1:-1:-1;;;;;1772:22:1;:27;;1764:36;;;;;;6065:8;2017:33;2041:8;2017:23;:33::i;:::-;2009:42;;;;;;;;6101:22;;;;:12;:22;;;;;;-1:-1:-1;;;;;6101:22:1;;-1:-1:-1;6133:43:1;6101:22;6156:9;6114:8;6133:15;:43::i;:::-;1810:1;5947:236;;;;:::o;7103:93::-;7173:9;:16;7103:93;;:::o;5871:188:0:-;8008:15;;;;;;;8000:24;;;;;;;;6012:40;6031:5;6038:3;6043:8;6012:18;:40::i;:::-;5871:188;;;:::o;8443:233:1:-;8553:16;1772:22;;;:12;:22;;;;8553:16;;-1:-1:-1;;;;;1772:22:1;:27;;1764:36;;;;;;-1:-1:-1;;;;;8598:19:1;;;;;;:11;:19;;;;;:26;8589:35;;8581:44;;;;;;-1:-1:-1;;;;;8642:19:1;;;;;;:11;:19;;;;;:27;;8662:6;;8642:27;;;;;;;;;;;;;;8635:34;;1810:1;8443:233;;;;;:::o;5295:196:0:-;8008:15;;;;;;;8000:24;;;;;;;;5440:44;5463:5;5470:3;5475:8;5440:22;:44::i;7843:155:1:-;7940:9;:16;7904:7;;7931:25;;7923:34;;;;;;7974:9;:17;;7984:6;;7974:17;;;;;;;;;;;;;;7967:24;;7843:155;;;:::o;7454:139::-;7538:7;1772:22;;;:12;:22;;;;;;7519:8;;-1:-1:-1;;;;;1772:22:1;:27;;1764:36;;;;;;-1:-1:-1;;7564:22:1;;;;:12;:22;;;;;;-1:-1:-1;;;;;7564:22:1;;7454:139::o;9006:147::-;9064:7;-1:-1:-1;;;;;9091:11:1;;;;9083:20;;;;;;-1:-1:-1;;;;;;9120:19:1;;;;;:11;:19;;;;;:26;;9006:147::o;3063:304:0:-;7828:5;;3213:15;;-1:-1:-1;;;;;7828:5:0;7814:10;:19;7806:28;;;;;;7921:17;;7902:15;:36;;7894:45;;;;;;3231:13;:11;:13::i;:::-;3213:31;;3254:34;3263:3;3268:7;3277:10;3254:8;:34::i;:::-;3352:7;3347:3;-1:-1:-1;;;;;3333:27:0;3342:3;3333:27;;;;;;;;;;3063:304;;;:::o;540:20:1:-;;;;;;;;;;;;;;;-1:-1:-1;;540:20:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4022:359:0;-1:-1:-1;;;;;4167:20:0;;4211:9;4167:20;;;:11;:20;;;;;;;;:27;4153:42;;;;;;;;;;;;;;;;4099:9;;;;4211;;4153:42;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;4153:42:0;;4120:75;;4223:1;4211:13;;4206:138;-1:-1:-1;;;;;4230:20:0;;;;;;:11;:20;;;;;:27;4226:31;;4206:138;;;-1:-1:-1;;;;;4309:20:0;;4297:36;4309:20;;;:11;:20;;;;;:23;;4297:11;;:36;4309:20;4330:1;;4309:23;;;;;;;;;;;;;;4297:36;;;;;;;;;;;;4278:13;4292:1;4278:16;;;;;;;;;;;;;;;;;;:55;4259:3;;4206:138;;6580:271:1;-1:-1:-1;;;;;6669:23:1;;6682:10;6669:23;;6661:32;;;;;;6747:10;6737:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;6737:32:1;;;;;;;;;;;;:44;;-1:-1:-1;;6737:44:1;;;;;;;;;;6796:48;;;;;;;6737:32;;6747:10;6796:48;;;;;;;;;;;6580:271;;:::o;1963:782:0:-;2094:17;2121:10;2153:9;2578:15;7921:17;;7902:15;:36;;7894:45;;;;;;;;2134:5;2121:18;;2165:1;2153:13;;2149:223;2172:1;2168;:5;2149:223;;;2240:4;:7;;2245:1;;2240:7;;;;;;;;;;;;;;;;;2223:37;;;;;;;;;;;2249:10;2223:37;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2223:37:0;;;;;;;;2213:48;;2223:37;;;;;;2213:48;;;;2223:37;2213:48;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;2213:48:0;;;;;;;;;;2198:63;;2194:168;;-1:-1:-1;2194:168:0;;-1:-1:-1;;2194:168:0;2293:1;2281:13;;2320:4;2312:12;;2342:5;;2194:168;2175:3;;;;;2149:223;;;2398:4;2389:13;;;;2381:22;;;;;;2485:40;2503:10;2515:9;2485:17;:40::i;:::-;:49;2477:58;;;;;;2596:13;:11;:13::i;:::-;2578:31;;2619:40;2628:10;2640:7;2649:9;2619:8;:40::i;:::-;2704:34;;2730:7;;2718:10;;2713:3;;2704:34;;2713:3;;2704:34;1963:782;;;;;:::o;4786:223::-;8008:15;;;;;;;8000:24;;;;;;;;4952:50;4975:5;4982:3;4987:8;4997:4;4952:22;:50::i;:::-;4786:223;;;;:::o;10287:110:1:-;10371:19;;;;:9;:19;;;;;;;;;10364:26;;;;;;-1:-1:-1;;10364:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10346:6;;10364:26;;;10371:19;10364:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10287:110;;;:::o;6539:96:0:-;7828:5;;-1:-1:-1;;;;;7828:5:0;7814:10;:19;7806:28;;;;;;6603:15;:25;;;;;;;;;;;;;;;;;6539:96::o;3596:243::-;3669:7;3727:24;;;:14;:24;;;;;;;;;3765:12;:22;;;;;;3801:11;:21;;;;;;3727:24;;-1:-1:-1;;;;;3765:22:0;;;;3801:21;3596:243::o;9872:142:1:-;-1:-1:-1;;;;;9979:17:1;;;9956:4;9979:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;9872:142::o;84:20:0:-;;;-1:-1:-1;;;;;84:20:0;;:::o;11151:189:1:-;11225:4;11248:22;;;:12;:22;;;;;;-1:-1:-1;;;;;11248:22:1;11274:10;11248:36;;:85;;-1:-1:-1;11288:33:1;11298:22;;;:12;:22;;;;;;;;;-1:-1:-1;;;;;11298:22:1;11288:33;;:9;:33;;;;;11322:10;11288:45;;;;;;;;;;11248:85;11241:92;11151:189;-1:-1:-1;;11151:189:1:o;11346:605::-;-1:-1:-1;;;;;11451:19:1;;;;;;;;11443:28;;;;;;11702:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;11702:30:1;:35;:53;;;;-1:-1:-1;;;;;;11741:14:1;;;11702:53;11698:247;;;11771:8;;;11698:247;11836:30;;;;:20;:30;;;;;;:42;;-1:-1:-1;;11836:42:1;-1:-1:-1;;;;;11836:42:1;;;;;;;;;11897:37;;11836:30;;11897:37;;;;;;;11346:605;;;:::o;2970:231::-;1772:22;;;;:12;:22;;;;;;3069:8;;-1:-1:-1;;;;;1772:22:1;:27;;1764:36;;;;;;3101:5;3108:3;3113:8;2166:33;2190:8;2166:23;:33::i;:::-;:81;;;-1:-1:-1;2203:30:1;;;;:20;:30;;;;;;-1:-1:-1;;;;;2203:30:1;2237:10;2203:44;2166:81;2158:90;;;;;;;;2266:22;;;;:12;:22;;;;;;-1:-1:-1;;;;;2266:31:1;;;:22;;:31;2258:40;;;;;;-1:-1:-1;;;;;2316:8:1;;;;2308:17;;;;;;3158:36;3173:5;3180:3;3185:8;3158:14;:36::i;:::-;1810:1;;;2970:231;;;;:::o;5004:580::-;5255:12;1772:22;;;:12;:22;;;;;;5107:8;;-1:-1:-1;;;;;1772:22:1;:27;;1764:36;;;;;;5139:5;5146:3;5151:8;2166:33;2190:8;2166:23;:33::i;:::-;:81;;;-1:-1:-1;2203:30:1;;;;:20;:30;;;;;;-1:-1:-1;;;;;2203:30:1;2237:10;2203:44;2166:81;2158:90;;;;;;;;2266:22;;;;:12;:22;;;;;;-1:-1:-1;;;;;2266:31:1;;;:22;;:31;2258:40;;;;;;-1:-1:-1;;;;;2316:8:1;;;;2308:17;;;;;;5171:36;5186:5;5193:3;5198:8;5171:14;:36::i;:::-;5308:3;5296:16;5288:24;;5378:1;5371:4;:8;5367:211;;;5444:83;;;5531:35;5444:83;;;5495:10;5444:83;;;;-1:-1:-1;;;;;5444:83:1;;;;;;;;;;;;;;;;;;-1:-1:-1;5444:83:1;;;;;;;;5531:35;;5444:50;;;;1678:10;;5444:83;;;;;;;;;;;;;;;;:50;:83;;;5:2:-1;;;;30:1;27;20:12;5:2;5444:83:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5444:83:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5444:83:1;-1:-1:-1;;5444:122:1;;5436:131;;;;;;1810:1;;;5004:580;;;;;:::o;7543:226:0:-;7661:29;7676:3;7681:8;7661:14;:29::i;:::-;7728:21;;;;:11;:21;;;;;;:34;-1:-1:-1;7543:226:0:o;6848:335::-;6957:4;;6973:182;-1:-1:-1;;;;;6997:20:0;;;;;;:11;:20;;;;;:27;6993:31;;6973:182;;;-1:-1:-1;;;;;7061:20:0;;7049:36;7061:20;;;:11;:20;;;;;:23;;7089:10;;7049:11;;:36;;7082:1;;7061:23;;;;;;;;;;;;;;7049:36;;;;;;;;;;;;:50;7045:100;;;7126:4;7119:11;;;;7045:100;7026:3;;6973:182;;;-1:-1:-1;7171:5:0;;6848:335;-1:-1:-1;;;6848:335:0:o;4052:594:1:-;4315:12;1772:22;;;:12;:22;;;;;;4167:8;;-1:-1:-1;;;;;1772:22:1;:27;;1764:36;;;;;;4199:5;4206:3;4211:8;2166:33;2190:8;2166:23;:33::i;:::-;:81;;;-1:-1:-1;2203:30:1;;;;:20;:30;;;;;;-1:-1:-1;;;;;2203:30:1;2237:10;2203:44;2166:81;2158:90;;;;;;;;2266:22;;;;:12;:22;;;;;;-1:-1:-1;;;;;2266:31:1;;;:22;;:31;2258:40;;;;;;-1:-1:-1;;;;;2316:8:1;;;;2308:17;;;;;;4231:36;4246:5;4253:3;4258:8;4231:14;:36::i;:::-;4368:3;4356:16;4348:24;;4438:1;4431:4;:8;4427:213;;;1678:10;4593:35;;4504:124;;;4533:3;-1:-1:-1;;;;;4504:50:1;;4555:10;4567:5;4574:8;4584:4;4504:85;;;;;;;;;;;;;-1:-1:-1;;;;;4504:85:1;-1:-1:-1;;;;;4504:85:1;;;;;;-1:-1:-1;;;;;4504:85:1;-1:-1:-1;;;;;4504:85:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4504:85:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4504:85:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4504:85:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4504:85:1;-1:-1:-1;;4504:124:1;;4496:133;;;;;;1810:1;;;4052:594;;;;;;:::o;11957:365::-;12101:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;12101:30:1;:35;12097:101;;12152:35;12168:5;12175:1;12178:8;12152:15;:35::i;:::-;12208:28;12220:5;12227:8;12208:11;:28::i;:::-;12246:23;12255:3;12260:8;12246;:23::i;:::-;12306:8;12301:3;-1:-1:-1;;;;;12285:30:1;12294:5;-1:-1:-1;;;;;12285:30:1;;;;;;;;;;;11957:365;;;:::o;12328:556::-;12435:9;27:10:-1;;39:1;23:18;;;45:23;;12435:24:1;;;;;;;12545:16;;-1:-1:-1;12518:24:1;;;:14;12435:24;12518;;;;;;;-1:-1:-1;;12545:18:1;;;12518:45;;12622:12;:22;;;;;:28;;-1:-1:-1;;;;;12622:28:1;;;-1:-1:-1;;12622:28:1;;;;;;;12744:16;;;:11;:16;;;;;27:10:-1;;23:18;;;45:23;;12744:31:1;;;;;;;;;;;;12852:23;;12823:26;;;:16;:26;;;;;;12852:25;;12823:54;;12328:556::o;12890:1474::-;13010:16;13029:24;;;:14;:24;;;;;;13089:9;:16;;13029:24;;13010:16;;;-1:-1:-1;;13214:19:1;;13204:30;;;;;;;;;;;;;;;13182:9;13192:8;13182:19;;;;;;;;;;;;;;;;;:52;;;;13386:8;13339:14;:44;13354:9;13380:1;13364:15;:17;13354:28;;;;;;;;;;;;;;;;;;13339:44;;;;;;;;;;;:55;;;;13470:9;13496:1;13480:15;:17;13470:28;;;;;;;;;;;;;;;;;;13463:35;13544:9;:21;;-1:-1:-1;;13544:21:1;;;;;;:::i;:::-;-1:-1:-1;;;13708:26:1;;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;13766:18:1;;;;:11;:18;;;;;;:25;;;-1:-1:-1;;13956:13:1;;13937:33;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13904:18:1;;;;:11;:18;;;;;;;:30;;13923:10;;13904:30;;;;;;;;;;;;;:66;;;;14122:10;14068:16;:51;14085:11;:18;14097:5;-1:-1:-1;;;;;14085:18:1;-1:-1:-1;;;;;14085:18:1;;;;;;;;;;;;14116:1;14104:11;:13;14085:33;;;;;;;;;;;;;;;;;;14068:51;;;;;;;;;;;:64;;;;14208:11;:18;14220:5;-1:-1:-1;;;;;14208:18:1;-1:-1:-1;;;;;14208:18:1;;;;;;;;;;;;14239:1;14227:11;:13;14208:33;;;;;;;;;;;;;;;;;;;;;14201:40;;;-1:-1:-1;;;;;14287:18:1;;;;:11;:18;;;;;:30;;-1:-1:-1;;14287:30:1;;;;;;:::i;:::-;-1:-1:-1;;;14335:22:1;;;;-1:-1:-1;;14335:12:1;:22;;;;;14328:29;;-1:-1:-1;;14328:29:1;;;-1:-1:-1;12890:1474:1:o;50:7994:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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