ETH Price: $2,061.98 (+7.04%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From184767072023-11-01 10:38:11848 days ago1698835091IN
0x34D565bd...D5F5e1d34
0 ETH0.0015679213.97950836
Transfer From184767032023-11-01 10:37:23848 days ago1698835043IN
0x34D565bd...D5F5e1d34
0 ETH0.0017090814.01362967
Set Approval For...184766852023-11-01 10:33:47848 days ago1698834827IN
0x34D565bd...D5F5e1d34
0 ETH0.0006677514.41977218
Transfer From123177042021-04-26 18:53:111766 days ago1619463191IN
0x34D565bd...D5F5e1d34
0 ETH0.0040379244
Transfer From123176632021-04-26 18:43:491766 days ago1619462629IN
0x34D565bd...D5F5e1d34
0 ETH0.004875448
Transfer From123176552021-04-26 18:41:521766 days ago1619462512IN
0x34D565bd...D5F5e1d34
0 ETH0.0039449944
Transfer From123176342021-04-26 18:37:011766 days ago1619462221IN
0x34D565bd...D5F5e1d34
0 ETH0.0047519253
Transfer From123176312021-04-26 18:36:231766 days ago1619462183IN
0x34D565bd...D5F5e1d34
0 ETH0.0052713253
Transfer From123176172021-04-26 18:33:181766 days ago1619461998IN
0x34D565bd...D5F5e1d34
0 ETH0.0044463146
Transfer From123176022021-04-26 18:31:151766 days ago1619461875IN
0x34D565bd...D5F5e1d34
0 ETH0.0041243146
Transfer From123175962021-04-26 18:29:361766 days ago1619461776IN
0x34D565bd...D5F5e1d34
0 ETH0.0046745747
Transfer From123175732021-04-26 18:25:521766 days ago1619461552IN
0x34D565bd...D5F5e1d34
0 ETH0.0046717146
Set Approval For...123110892021-04-25 18:30:031767 days ago1619375403IN
0x34D565bd...D5F5e1d34
0 ETH0.002273249
Transfer From107470962020-08-28 4:48:282008 days ago1598590108IN
0x34D565bd...D5F5e1d34
0 ETH0.0061650657
Transfer From107470962020-08-28 4:48:282008 days ago1598590108IN
0x34D565bd...D5F5e1d34
0 ETH0.0061650657
Transfer From107470962020-08-28 4:48:282008 days ago1598590108IN
0x34D565bd...D5F5e1d34
0 ETH0.0061650657
Transfer From107470122020-08-28 4:27:272008 days ago1598588847IN
0x34D565bd...D5F5e1d34
0 ETH0.0061650657
Transfer From107470122020-08-28 4:27:272008 days ago1598588847IN
0x34D565bd...D5F5e1d34
0 ETH0.0059256657
Transfer From107470122020-08-28 4:27:272008 days ago1598588847IN
0x34D565bd...D5F5e1d34
0 ETH0.0061650657
Transfer From107469522020-08-28 4:12:552008 days ago1598587975IN
0x34D565bd...D5F5e1d34
0 ETH0.0061650657
Set Approval For...107468562020-08-28 3:50:492008 days ago1598586649IN
0x34D565bd...D5F5e1d34
0 ETH0.0026604259
Transfer107468062020-08-28 3:40:002008 days ago1598586000IN
0x34D565bd...D5F5e1d34
0 ETH0.0012388356
Transfer107467582020-08-28 3:27:022008 days ago1598585222IN
0x34D565bd...D5F5e1d34
0 ETH0.001106150
Transfer From81348832019-07-12 7:10:062421 days ago1562915406IN
0x34D565bd...D5F5e1d34
0 ETH0.00101418
Transfer From81348832019-07-12 7:10:062421 days ago1562915406IN
0x34D565bd...D5F5e1d34
0 ETH0.00101418
View all transactions

Latest 10 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer From184766882023-11-01 10:34:23848 days ago1698834863
0x34D565bd...D5F5e1d34
0 ETH
Transfer From184766882023-11-01 10:34:23848 days ago1698834863
0x34D565bd...D5F5e1d34
0 ETH
Transfer From184766882023-11-01 10:34:23848 days ago1698834863
0x34D565bd...D5F5e1d34
0 ETH
Transfer From184766882023-11-01 10:34:23848 days ago1698834863
0x34D565bd...D5F5e1d34
0 ETH
Transfer From184766882023-11-01 10:34:23848 days ago1698834863
0x34D565bd...D5F5e1d34
0 ETH
Transfer From184766882023-11-01 10:34:23848 days ago1698834863
0x34D565bd...D5F5e1d34
0 ETH
Transfer From184766882023-11-01 10:34:23848 days ago1698834863
0x34D565bd...D5F5e1d34
0 ETH
Transfer From123110962021-04-25 18:31:431767 days ago1619375503
0x34D565bd...D5F5e1d34
0 ETH
Transfer From107468582020-08-28 3:51:572008 days ago1598586717
0x34D565bd...D5F5e1d34
0 ETH
Transfer From107468582020-08-28 3:51:572008 days ago1598586717
0x34D565bd...D5F5e1d34
0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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

API
[{"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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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