POL Price: $0.378706 (+0.16%)
 

Overview

Max Total Supply

143 SMTA

Holders

18

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SMTA
0x2090FFb6C8FC01acE8711692405951a59542Be92
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
SandStorm

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-02-04
*/

// SPDX-License-Identifier:UNLICENSED
pragma solidity ^0.8.4;

library Strings {

    function toString(uint256 value) internal pure returns (string memory) {

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

library EnumerableMap {

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        MapEntry[] _entries;

        mapping (bytes32 => uint256) _indexes;
    }

    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    function _remove(Map storage map, bytes32 key) private returns (bool) {
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;
            MapEntry storage lastEntry = map._entries[lastIndex];

            map._entries[toDeleteIndex] = lastEntry;
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            map._entries.pop();

            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    struct UintToAddressMap {
        Map _inner;
    }

    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];

            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }


    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */    

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }


    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

        /**
    * @dev Integer modulo of two numbers, truncating the remainder.
    */ 

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

}  

interface IERC165 {

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */ 

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {

    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    event URI(string value, uint256 indexed id);

    event tokenBaseURI(string value);

    function balanceOf(address owner) external view returns (uint256 balance);

    function royaltyFee(uint256 tokenId) external view  returns(uint256);
        
    function getCreator(uint256 tokenId) external view returns(address);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}


interface IERC721Receiver {

    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}

interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to account balances

    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    EnumerableMap.UintToAddressMap private _tokenOwners;

     // Mapping from tokenId to operator approvals

    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from account to operator approvals

    mapping (address => mapping (address => bool)) private _operatorApprovals;

    string private _name;

    string private _symbol;

    // mapping for token URIs

    mapping (uint256 => string) private _tokenURIs;

   // mapping for token royaltyFee    

    mapping(uint256 => uint256) private _royaltyFee;

  // mapping for token creator

    mapping (uint256 => address) private _creator;

    string private _baseURI = "https://gateway.pinata.cloud/ipfs/";

    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;

        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
        @notice Get the Token balance of an account's.
        @param owner  The address of the token holder
        @return        The account's balance of the Token type requested
     */

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _holderTokens[owner].length();
    }

    /**
        @notice Get the owner of tokenId.
        @param tokenId  The tokenId of the token holder
        @return        The current owner of the requested tokenId
     */

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    function royaltyFee(uint256 tokenId) public view override returns(uint256) {
        return _royaltyFee[tokenId];
    }

    function getCreator(uint256 tokenId) public view override returns(address) {
        return _creator[tokenId];
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _tokenOwners.length();
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        @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) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
        @notice Queries the approval status of an operator for a given owner.
        @param owner     The owner of the Tokens
        @param operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }


    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
        MUST revert on any other error.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param from    Source address
        @param to      Target address
        @param tokenId      ID of the token type.
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
    */

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);

    }

    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId, uint256 fee) internal virtual {
        _safeMint(to, tokenId, fee, "");
    }

    function _safeMint(address to, uint256 tokenId, uint256 fee, bytes memory _data) internal virtual {
        _mint(to, tokenId, fee);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _mint(address to, uint256 tokenId, uint256 fee) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);
        _creator[tokenId] = msg.sender;
        _royaltyFee[tokenId] = fee;

        emit Transfer(address(0), to, tokenId);
       
    }

     /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {ERC721-_burn} instead.
     * required msg.sender must be owner of the token.
     * @param tokenId uint256 Token being burned
     */

    function _burn(uint256 tokenId) internal virtual {
        require(msg.sender == ownerOf(tokenId),"caller not owner");
        address owner = ERC721.ownerOf(tokenId); // internal owner

        _beforeTokenTransfer(owner, address(0), tokenId);

        _approve(address(0), tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

     /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param _tokenURI string URI to assign
     */

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
         emit URI(_tokenURI, tokenId);
    }

    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
        emit tokenBaseURI(baseURI_);
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

contract SandStorm is ERC721 {
    uint256 public tokenCounter;
    address public owner;

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

    struct Sign {
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    constructor (string memory name, string memory symbol) ERC721 (name, symbol){
        tokenCounter = 1;
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    function transferOwnership(address newOwner) public onlyOwner returns(bool){
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
        return true;
    }

    function verifySign(string memory tokenURI, address caller, Sign memory sign) internal view {
        bytes32 hash = keccak256(abi.encodePacked(this, caller, tokenURI));
        require(owner == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), sign.v, sign.r, sign.s), "Owner sign verification failed");
    }

    
    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param sign struct combination of uint8, bytes32, bytes32 are v, r, s.
     * @param tokenURI string memory URI of the token to be minted.
     * @param fee uint256 royalty of the token to be minted.
     */

    function createCollectible(string memory tokenURI, uint256 fee, Sign memory sign) public returns (uint256) {
        uint256 newItemId = tokenCounter;
        verifySign(tokenURI, msg.sender, sign);
        _safeMint(msg.sender, newItemId, fee);
        _setTokenURI(newItemId, tokenURI);
        tokenCounter = tokenCounter + 1;
        return newItemId;
    }

    function setBaseURI(string memory _baseURI) public onlyOwner{
        _setBaseURI(_baseURI);
    }
    
    function burn(uint256 tokenId) public {
        require(_exists(tokenId), "ERC721: nonexistent token");
        _burn(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"tokenBaseURI","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"fee","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct SandStorm.Sign","name":"sign","type":"tuple"}],"name":"createCollectible","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"royaltyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60e060405260226080818152906200282c60a03980516200002991600b9160209091019062000175565b503480156200003757600080fd5b506040516200284e3803806200284e8339810160408190526200005a91620002ce565b81816200006e6301ffc9a760e01b620000f1565b81516200008390600690602085019062000175565b5080516200009990600790602084019062000175565b50620000ac6380ac58cd60e01b620000f1565b620000be635b5e139f60e01b620000f1565b620000d063780e9d6360e01b620000f1565b50506001600c555050600d80546001600160a01b0319163317905562000388565b6001600160e01b03198082161415620001505760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054620001839062000335565b90600052602060002090601f016020900481019282620001a75760008555620001f2565b82601f10620001c257805160ff1916838001178555620001f2565b82800160010185558215620001f2579182015b82811115620001f2578251825591602001919060010190620001d5565b506200020092915062000204565b5090565b5b8082111562000200576000815560010162000205565b600082601f8301126200022c578081fd5b81516001600160401b038082111562000249576200024962000372565b604051601f8301601f19908116603f0116810190828211818310171562000274576200027462000372565b8160405283815260209250868385880101111562000290578485fd5b8491505b83821015620002b3578582018301518183018401529082019062000294565b83821115620002c457848385830101525b9695505050505050565b60008060408385031215620002e1578182fd5b82516001600160401b0380821115620002f8578384fd5b62000306868387016200021b565b935060208501519150808211156200031c578283fd5b506200032b858286016200021b565b9150509250929050565b600181811c908216806200034a57607f821691505b602082108114156200036c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61249480620003986000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80636c0360eb116100de578063c57dc23511610097578063d082e38111610071578063d082e3811461034c578063d48e638a14610355578063e985e9c51461037e578063f2fde38b146103ba57600080fd5b8063c57dc23514610306578063c7ed93f214610326578063c87b56dd1461033957600080fd5b80636c0360eb146102aa57806370a08231146102b25780638da5cb5b146102c557806395d89b41146102d8578063a22cb465146102e0578063b88d4fde146102f357600080fd5b80632f745c59116101305780632f745c591461023857806342842e0e1461024b57806342966c681461025e5780634f6ccce71461027157806355f804b3146102845780636352211e1461029757600080fd5b806301ffc9a71461017857806306fdde03146101ba578063081812fc146101cf578063095ea7b3146101fa57806318160ddd1461020f57806323b872dd14610225575b600080fd5b6101a5610186366004612033565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6101c26103cd565b6040516101b19190612257565b6101e26101dd366004612145565b61045f565b6040516001600160a01b0390911681526020016101b1565b61020d61020836600461200a565b6104ec565b005b610217610602565b6040519081526020016101b1565b61020d610233366004611f1c565b610613565b61021761024636600461200a565b610644565b61020d610259366004611f1c565b61066f565b61020d61026c366004612145565b61068a565b61021761027f366004612145565b6106eb565b61020d61029236600461206b565b610701565b6101e26102a5366004612145565b610764565b6101c261078c565b6102176102c0366004611ed0565b61079b565b600d546101e2906001600160a01b031681565b6101c2610827565b61020d6102ee366004611fd0565b610836565b61020d610301366004611f57565b6108fb565b610217610314366004612145565b60009081526009602052604090205490565b61021761033436600461209e565b610933565b6101c2610347366004612145565b610974565b610217600c5481565b6101e2610363366004612145565b6000908152600a60205260409020546001600160a01b031690565b6101a561038c366004611eea565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101a56103c8366004611ed0565b610ae6565b6060600680546103dc90612341565b80601f016020809104026020016040519081016040528092919081815260200182805461040890612341565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050905090565b600061046a82610c06565b6104d05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006104f782610764565b9050806001600160a01b0316836001600160a01b031614156105655760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104c7565b336001600160a01b03821614806105815750610581813361038c565b6105f35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104c7565b6105fd8383610c13565b505050565b600061060e6002610c81565b905090565b61061d3382610c8b565b6106395760405162461bcd60e51b81526004016104c79061226a565b6105fd838383610d75565b6001600160a01b03821660009081526001602052604081206106669083610ef6565b90505b92915050565b6105fd838383604051806020016040528060008152506108fb565b61069381610c06565b6106df5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064016104c7565b6106e881610f02565b50565b6000806106f9600284611018565b509392505050565b600d546001600160a01b0316331461075b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c7565b6106e881611034565b6000610669826040518060600160405280602981526020016124366029913960029190611082565b6060600b80546103dc90612341565b60006001600160a01b0382166108065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016104c7565b6001600160a01b038216600090815260016020526040902061066990610c81565b6060600780546103dc90612341565b6001600160a01b03821633141561088f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104c7565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6109053383610c8b565b6109215760405162461bcd60e51b81526004016104c79061226a565b61092d8484848461108f565b50505050565b600c5460009061094485338561110d565b61094f338286611250565b610959818661126b565b600c546109679060016122bb565b600c5590505b9392505050565b606061097f82610c06565b6109e35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104c7565b600082815260086020526040812080546109fc90612341565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2890612341565b8015610a755780601f10610a4a57610100808354040283529160200191610a75565b820191906000526020600020905b815481529060010190602001808311610a5857829003601f168201915b505050505090506000610a8661078c565b9050805160001415610a99575092915050565b815115610acb578082604051602001610ab39291906121eb565b60405160208183030381529060405292505050919050565b80610ad585611331565b604051602001610ab39291906121eb565b600d546000906001600160a01b03163314610b435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c7565b6001600160a01b038216610ba85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c7565b600d546040516001600160a01b038085169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350600d80546001600160a01b0319166001600160a01b03831617905560015b919050565b6000610669600283611464565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610c4882610764565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610669825490565b6000610c9682610c06565b610cf75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104c7565b6000610d0283610764565b9050806001600160a01b0316846001600160a01b03161480610d3d5750836001600160a01b0316610d328461045f565b6001600160a01b0316145b80610d6d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610d8882610764565b6001600160a01b031614610df05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016104c7565b6001600160a01b038216610e525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104c7565b610e5d600082610c13565b6001600160a01b0383166000908152600160205260409020610e7f908261147c565b506001600160a01b0382166000908152600160205260409020610ea29082611488565b50610eaf60028284611494565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061066683836114aa565b610f0b81610764565b6001600160a01b0316336001600160a01b031614610f5e5760405162461bcd60e51b815260206004820152601060248201526f31b0b63632b9103737ba1037bbb732b960811b60448201526064016104c7565b6000610f6982610764565b9050610f76600083610c13565b60008281526008602052604090208054610f8f90612341565b159050610fad576000828152600860205260408120610fad91611d51565b6001600160a01b0381166000908152600160205260409020610fcf908361147c565b50610fdb60028361153e565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080611027868661154a565b9097909650945050505050565b805161104790600b906020840190611d8b565b507f5514cc7324ac64a875ba50a1849367d39c8b030fe0f563c3c7142984552bc306816040516110779190612257565b60405180910390a150565b6000610d6d8484846115f5565b61109a848484610d75565b6110a68484848461166c565b61092d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c7565b6000308385604051602001611124939291906121a5565b60405160208183030381529060405280519060200120905060018160405160200161117b91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f19818403018152828252805160209182012086518783015188850151600087529386018086529290925260ff16928401929092526060830191909152608082015260a0016020604051602081039080840390855afa1580156111e7573d6000803e3d6000fd5b5050604051601f190151600d546001600160a01b03908116911614905061092d5760405162461bcd60e51b815260206004820152601e60248201527f4f776e6572207369676e20766572696669636174696f6e206661696c6564000060448201526064016104c7565b6105fd8383836040518060200160405280600081525061173d565b61127482610c06565b6112d55760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104c7565b600082815260086020908152604090912082516112f492840190611d8b565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516113259190612257565b60405180910390a25050565b6060816113555750506040805180820190915260018152600360fc1b602082015290565b8160005b811561137f57806113698161237c565b91506113789050600a836122d3565b9150611359565b60008167ffffffffffffffff8111156113a857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156113d2576020820181803683370190505b50905060006113e26001846122e7565b90508593505b831561145b576113f9600a85612397565b6114049060306122bb565b60f81b82826114128161232a565b93508151811061143257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611454600a856122d3565b93506113e8565b50949350505050565b60008181526001830160205260408120541515610666565b60006106668383611755565b60006106668383611872565b6000610d6d84846001600160a01b0385166118c1565b815460009082106115085760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016104c7565b82600001828154811061152b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60006106668383611970565b8154600090819083106115aa5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016104c7565b60008460000184815481106115cf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816116255760405162461bcd60e51b81526004016104c79190612257565b50846116326001836122e7565b8154811061165057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b60006001600160a01b0384163b61168557506001610d6d565b6000611706630a85bd0160e11b338887876040516024016116a9949392919061221a565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612404603291396001600160a01b0388169190611aa1565b905060008180602001905181019061171e919061204f565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b611748848484611ab0565b6110a6600085858461166c565b600081815260018301602052604081205480156118685760006117796001836122e7565b855490915060009061178d906001906122e7565b905060008660000182815481106117b457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106117e557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556117fc8360016122bb565b6000828152600189016020526040902055865487908061182c57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610669565b6000915050610669565b60008181526001830160205260408120546118b957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610669565b506000610669565b60008281526001840160205260408120548061192657505060408051808201825283815260208082018481528654600181810189556000898152848120955160029093029095019182559151908201558654868452818801909252929091205561096d565b82856119336001846122e7565b8154811061195157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010181905550600091505061096d565b600081815260018301602052604081205480156118685760006119946001836122e7565b85549091506000906119a8906001906122e7565b905060008660000182815481106119cf57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201905080876000018481548110611a0357634e487b7160e01b600052603260045260246000fd5b60009182526020909120825460029092020190815560019182015490820155611a2d9084906122bb565b815460009081526001890160205260409020558654879080611a5f57634e487b7160e01b600052603160045260246000fd5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506106699350505050565b6060610d6d8484600085611bf0565b6001600160a01b038316611b065760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104c7565b611b0f82610c06565b15611b5c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104c7565b6001600160a01b0383166000908152600160205260409020611b7e9083611488565b50611b8b60028385611494565b506000828152600a6020908152604080832080546001600160a01b0319163317905560099091528082208390555183916001600160a01b038616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b606082471015611c515760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c7565b843b611c9f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c7565b600080866001600160a01b03168587604051611cbb9190612189565b60006040518083038185875af1925050503d8060008114611cf8576040519150601f19603f3d011682016040523d82523d6000602084013e611cfd565b606091505b5091509150611d0d828286611d18565b979650505050505050565b60608315611d2757508161096d565b825115611d375782518084602001fd5b8160405162461bcd60e51b81526004016104c79190612257565b508054611d5d90612341565b6000825580601f10611d6d575050565b601f0160209004906000526020600020908101906106e89190611e0f565b828054611d9790612341565b90600052602060002090601f016020900481019282611db95760008555611dff565b82601f10611dd257805160ff1916838001178555611dff565b82800160010185558215611dff579182015b82811115611dff578251825591602001919060010190611de4565b50611e0b929150611e0f565b5090565b5b80821115611e0b5760008155600101611e10565b600067ffffffffffffffff80841115611e3f57611e3f6123d7565b604051601f8501601f19908116603f01168101908282118183101715611e6757611e676123d7565b81604052809350858152868686011115611e8057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610c0157600080fd5b600082601f830112611ec1578081fd5b61066683833560208501611e24565b600060208284031215611ee1578081fd5b61066682611e9a565b60008060408385031215611efc578081fd5b611f0583611e9a565b9150611f1360208401611e9a565b90509250929050565b600080600060608486031215611f30578081fd5b611f3984611e9a565b9250611f4760208501611e9a565b9150604084013590509250925092565b60008060008060808587031215611f6c578081fd5b611f7585611e9a565b9350611f8360208601611e9a565b925060408501359150606085013567ffffffffffffffff811115611fa5578182fd5b8501601f81018713611fb5578182fd5b611fc487823560208401611e24565b91505092959194509250565b60008060408385031215611fe2578182fd5b611feb83611e9a565b915060208301358015158114611fff578182fd5b809150509250929050565b6000806040838503121561201c578182fd5b61202583611e9a565b946020939093013593505050565b600060208284031215612044578081fd5b813561096d816123ed565b600060208284031215612060578081fd5b815161096d816123ed565b60006020828403121561207c578081fd5b813567ffffffffffffffff811115612092578182fd5b610d6d84828501611eb1565b600080600083850360a08112156120b3578384fd5b843567ffffffffffffffff808211156120ca578586fd5b6120d688838901611eb1565b9550602087013594506060603f19840112156120f0578384fd5b6040519250606083019150828210818311171561210f5761210f6123d7565b50604090815285013560ff81168114612126578283fd5b8152606085013560208201526080909401356040850152509093909250565b600060208284031215612156578081fd5b5035919050565b600081518084526121758160208601602086016122fe565b601f01601f19169290920160200192915050565b6000825161219b8184602087016122fe565b9190910192915050565b60006bffffffffffffffffffffffff19808660601b168352808560601b1660148401525082516121dc8160288501602087016122fe565b91909101602801949350505050565b600083516121fd8184602088016122fe565b8351908301906122118183602088016122fe565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061224d9083018461215d565b9695505050505050565b602081526000610666602083018461215d565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156122ce576122ce6123ab565b500190565b6000826122e2576122e26123c1565b500490565b6000828210156122f9576122f96123ab565b500390565b60005b83811015612319578181015183820152602001612301565b8381111561092d5750506000910152565b600081612339576123396123ab565b506000190190565b600181811c9082168061235557607f821691505b6020821081141561237657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612390576123906123ab565b5060010190565b6000826123a6576123a66123c1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106e857600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212208273779b97c6bc12ad70f91ad5b02a1483241e038dd85eba2cc65eb51df86c6d64736f6c6343000804003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000953616e6453746f726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534d544100000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80636c0360eb116100de578063c57dc23511610097578063d082e38111610071578063d082e3811461034c578063d48e638a14610355578063e985e9c51461037e578063f2fde38b146103ba57600080fd5b8063c57dc23514610306578063c7ed93f214610326578063c87b56dd1461033957600080fd5b80636c0360eb146102aa57806370a08231146102b25780638da5cb5b146102c557806395d89b41146102d8578063a22cb465146102e0578063b88d4fde146102f357600080fd5b80632f745c59116101305780632f745c591461023857806342842e0e1461024b57806342966c681461025e5780634f6ccce71461027157806355f804b3146102845780636352211e1461029757600080fd5b806301ffc9a71461017857806306fdde03146101ba578063081812fc146101cf578063095ea7b3146101fa57806318160ddd1461020f57806323b872dd14610225575b600080fd5b6101a5610186366004612033565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6101c26103cd565b6040516101b19190612257565b6101e26101dd366004612145565b61045f565b6040516001600160a01b0390911681526020016101b1565b61020d61020836600461200a565b6104ec565b005b610217610602565b6040519081526020016101b1565b61020d610233366004611f1c565b610613565b61021761024636600461200a565b610644565b61020d610259366004611f1c565b61066f565b61020d61026c366004612145565b61068a565b61021761027f366004612145565b6106eb565b61020d61029236600461206b565b610701565b6101e26102a5366004612145565b610764565b6101c261078c565b6102176102c0366004611ed0565b61079b565b600d546101e2906001600160a01b031681565b6101c2610827565b61020d6102ee366004611fd0565b610836565b61020d610301366004611f57565b6108fb565b610217610314366004612145565b60009081526009602052604090205490565b61021761033436600461209e565b610933565b6101c2610347366004612145565b610974565b610217600c5481565b6101e2610363366004612145565b6000908152600a60205260409020546001600160a01b031690565b6101a561038c366004611eea565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101a56103c8366004611ed0565b610ae6565b6060600680546103dc90612341565b80601f016020809104026020016040519081016040528092919081815260200182805461040890612341565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050905090565b600061046a82610c06565b6104d05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006104f782610764565b9050806001600160a01b0316836001600160a01b031614156105655760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016104c7565b336001600160a01b03821614806105815750610581813361038c565b6105f35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104c7565b6105fd8383610c13565b505050565b600061060e6002610c81565b905090565b61061d3382610c8b565b6106395760405162461bcd60e51b81526004016104c79061226a565b6105fd838383610d75565b6001600160a01b03821660009081526001602052604081206106669083610ef6565b90505b92915050565b6105fd838383604051806020016040528060008152506108fb565b61069381610c06565b6106df5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064016104c7565b6106e881610f02565b50565b6000806106f9600284611018565b509392505050565b600d546001600160a01b0316331461075b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c7565b6106e881611034565b6000610669826040518060600160405280602981526020016124366029913960029190611082565b6060600b80546103dc90612341565b60006001600160a01b0382166108065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016104c7565b6001600160a01b038216600090815260016020526040902061066990610c81565b6060600780546103dc90612341565b6001600160a01b03821633141561088f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104c7565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6109053383610c8b565b6109215760405162461bcd60e51b81526004016104c79061226a565b61092d8484848461108f565b50505050565b600c5460009061094485338561110d565b61094f338286611250565b610959818661126b565b600c546109679060016122bb565b600c5590505b9392505050565b606061097f82610c06565b6109e35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104c7565b600082815260086020526040812080546109fc90612341565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2890612341565b8015610a755780601f10610a4a57610100808354040283529160200191610a75565b820191906000526020600020905b815481529060010190602001808311610a5857829003601f168201915b505050505090506000610a8661078c565b9050805160001415610a99575092915050565b815115610acb578082604051602001610ab39291906121eb565b60405160208183030381529060405292505050919050565b80610ad585611331565b604051602001610ab39291906121eb565b600d546000906001600160a01b03163314610b435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c7565b6001600160a01b038216610ba85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c7565b600d546040516001600160a01b038085169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350600d80546001600160a01b0319166001600160a01b03831617905560015b919050565b6000610669600283611464565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610c4882610764565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610669825490565b6000610c9682610c06565b610cf75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104c7565b6000610d0283610764565b9050806001600160a01b0316846001600160a01b03161480610d3d5750836001600160a01b0316610d328461045f565b6001600160a01b0316145b80610d6d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610d8882610764565b6001600160a01b031614610df05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016104c7565b6001600160a01b038216610e525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104c7565b610e5d600082610c13565b6001600160a01b0383166000908152600160205260409020610e7f908261147c565b506001600160a01b0382166000908152600160205260409020610ea29082611488565b50610eaf60028284611494565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061066683836114aa565b610f0b81610764565b6001600160a01b0316336001600160a01b031614610f5e5760405162461bcd60e51b815260206004820152601060248201526f31b0b63632b9103737ba1037bbb732b960811b60448201526064016104c7565b6000610f6982610764565b9050610f76600083610c13565b60008281526008602052604090208054610f8f90612341565b159050610fad576000828152600860205260408120610fad91611d51565b6001600160a01b0381166000908152600160205260409020610fcf908361147c565b50610fdb60028361153e565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080611027868661154a565b9097909650945050505050565b805161104790600b906020840190611d8b565b507f5514cc7324ac64a875ba50a1849367d39c8b030fe0f563c3c7142984552bc306816040516110779190612257565b60405180910390a150565b6000610d6d8484846115f5565b61109a848484610d75565b6110a68484848461166c565b61092d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c7565b6000308385604051602001611124939291906121a5565b60405160208183030381529060405280519060200120905060018160405160200161117b91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f19818403018152828252805160209182012086518783015188850151600087529386018086529290925260ff16928401929092526060830191909152608082015260a0016020604051602081039080840390855afa1580156111e7573d6000803e3d6000fd5b5050604051601f190151600d546001600160a01b03908116911614905061092d5760405162461bcd60e51b815260206004820152601e60248201527f4f776e6572207369676e20766572696669636174696f6e206661696c6564000060448201526064016104c7565b6105fd8383836040518060200160405280600081525061173d565b61127482610c06565b6112d55760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016104c7565b600082815260086020908152604090912082516112f492840190611d8b565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516113259190612257565b60405180910390a25050565b6060816113555750506040805180820190915260018152600360fc1b602082015290565b8160005b811561137f57806113698161237c565b91506113789050600a836122d3565b9150611359565b60008167ffffffffffffffff8111156113a857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156113d2576020820181803683370190505b50905060006113e26001846122e7565b90508593505b831561145b576113f9600a85612397565b6114049060306122bb565b60f81b82826114128161232a565b93508151811061143257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611454600a856122d3565b93506113e8565b50949350505050565b60008181526001830160205260408120541515610666565b60006106668383611755565b60006106668383611872565b6000610d6d84846001600160a01b0385166118c1565b815460009082106115085760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016104c7565b82600001828154811061152b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60006106668383611970565b8154600090819083106115aa5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016104c7565b60008460000184815481106115cf57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816116255760405162461bcd60e51b81526004016104c79190612257565b50846116326001836122e7565b8154811061165057634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b60006001600160a01b0384163b61168557506001610d6d565b6000611706630a85bd0160e11b338887876040516024016116a9949392919061221a565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612404603291396001600160a01b0388169190611aa1565b905060008180602001905181019061171e919061204f565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b611748848484611ab0565b6110a6600085858461166c565b600081815260018301602052604081205480156118685760006117796001836122e7565b855490915060009061178d906001906122e7565b905060008660000182815481106117b457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106117e557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556117fc8360016122bb565b6000828152600189016020526040902055865487908061182c57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610669565b6000915050610669565b60008181526001830160205260408120546118b957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610669565b506000610669565b60008281526001840160205260408120548061192657505060408051808201825283815260208082018481528654600181810189556000898152848120955160029093029095019182559151908201558654868452818801909252929091205561096d565b82856119336001846122e7565b8154811061195157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010181905550600091505061096d565b600081815260018301602052604081205480156118685760006119946001836122e7565b85549091506000906119a8906001906122e7565b905060008660000182815481106119cf57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201905080876000018481548110611a0357634e487b7160e01b600052603260045260246000fd5b60009182526020909120825460029092020190815560019182015490820155611a2d9084906122bb565b815460009081526001890160205260409020558654879080611a5f57634e487b7160e01b600052603160045260246000fd5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506106699350505050565b6060610d6d8484600085611bf0565b6001600160a01b038316611b065760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104c7565b611b0f82610c06565b15611b5c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104c7565b6001600160a01b0383166000908152600160205260409020611b7e9083611488565b50611b8b60028385611494565b506000828152600a6020908152604080832080546001600160a01b0319163317905560099091528082208390555183916001600160a01b038616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b606082471015611c515760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104c7565b843b611c9f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104c7565b600080866001600160a01b03168587604051611cbb9190612189565b60006040518083038185875af1925050503d8060008114611cf8576040519150601f19603f3d011682016040523d82523d6000602084013e611cfd565b606091505b5091509150611d0d828286611d18565b979650505050505050565b60608315611d2757508161096d565b825115611d375782518084602001fd5b8160405162461bcd60e51b81526004016104c79190612257565b508054611d5d90612341565b6000825580601f10611d6d575050565b601f0160209004906000526020600020908101906106e89190611e0f565b828054611d9790612341565b90600052602060002090601f016020900481019282611db95760008555611dff565b82601f10611dd257805160ff1916838001178555611dff565b82800160010185558215611dff579182015b82811115611dff578251825591602001919060010190611de4565b50611e0b929150611e0f565b5090565b5b80821115611e0b5760008155600101611e10565b600067ffffffffffffffff80841115611e3f57611e3f6123d7565b604051601f8501601f19908116603f01168101908282118183101715611e6757611e676123d7565b81604052809350858152868686011115611e8057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114610c0157600080fd5b600082601f830112611ec1578081fd5b61066683833560208501611e24565b600060208284031215611ee1578081fd5b61066682611e9a565b60008060408385031215611efc578081fd5b611f0583611e9a565b9150611f1360208401611e9a565b90509250929050565b600080600060608486031215611f30578081fd5b611f3984611e9a565b9250611f4760208501611e9a565b9150604084013590509250925092565b60008060008060808587031215611f6c578081fd5b611f7585611e9a565b9350611f8360208601611e9a565b925060408501359150606085013567ffffffffffffffff811115611fa5578182fd5b8501601f81018713611fb5578182fd5b611fc487823560208401611e24565b91505092959194509250565b60008060408385031215611fe2578182fd5b611feb83611e9a565b915060208301358015158114611fff578182fd5b809150509250929050565b6000806040838503121561201c578182fd5b61202583611e9a565b946020939093013593505050565b600060208284031215612044578081fd5b813561096d816123ed565b600060208284031215612060578081fd5b815161096d816123ed565b60006020828403121561207c578081fd5b813567ffffffffffffffff811115612092578182fd5b610d6d84828501611eb1565b600080600083850360a08112156120b3578384fd5b843567ffffffffffffffff808211156120ca578586fd5b6120d688838901611eb1565b9550602087013594506060603f19840112156120f0578384fd5b6040519250606083019150828210818311171561210f5761210f6123d7565b50604090815285013560ff81168114612126578283fd5b8152606085013560208201526080909401356040850152509093909250565b600060208284031215612156578081fd5b5035919050565b600081518084526121758160208601602086016122fe565b601f01601f19169290920160200192915050565b6000825161219b8184602087016122fe565b9190910192915050565b60006bffffffffffffffffffffffff19808660601b168352808560601b1660148401525082516121dc8160288501602087016122fe565b91909101602801949350505050565b600083516121fd8184602088016122fe565b8351908301906122118183602088016122fe565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061224d9083018461215d565b9695505050505050565b602081526000610666602083018461215d565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156122ce576122ce6123ab565b500190565b6000826122e2576122e26123c1565b500490565b6000828210156122f9576122f96123ab565b500390565b60005b83811015612319578181015183820152602001612301565b8381111561092d5750506000910152565b600081612339576123396123ab565b506000190190565b600181811c9082168061235557607f821691505b6020821081141561237657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612390576123906123ab565b5060010190565b6000826123a6576123a66123c1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106e857600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212208273779b97c6bc12ad70f91ad5b02a1483241e038dd85eba2cc65eb51df86c6d64736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000953616e6453746f726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534d544100000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): SandStorm
Arg [1] : symbol (string): SMTA

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 53616e6453746f726d0000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 534d544100000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

30634:2147:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15450:150;;;;;;:::i;:::-;-1:-1:-1;;;;;;15559:33:0;15535:4;15559:33;;;;;;;;;;;;;;15450:150;;;;8165:14:1;;8158:22;8140:41;;8128:2;8113:18;15450:150:0;;;;;;;;20781:100;;;:::i;:::-;;;;;;;:::i;22808:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7447:32:1;;;7429:51;;7417:2;7402:18;22808:221:0;7384:102:1;22396:404:0;;;;;;:::i;:::-;;:::i;:::-;;22091:117;;;:::i;:::-;;;17979:25:1;;;17967:2;17952:18;22091:117:0;17934:76:1;24145:252:0;;;;;;:::i;:::-;;:::i;21921:162::-;;;;;;:::i;:::-;;:::i;24405:151::-;;;;;;:::i;:::-;;:::i;32642:136::-;;;;;;:::i;:::-;;:::i;22216:172::-;;;;;;:::i;:::-;;:::i;32530:100::-;;;;;;:::i;:::-;;:::i;20596:177::-;;;;;;:::i;:::-;;:::i;21561:97::-;;;:::i;20180:221::-;;;;;;:::i;:::-;;:::i;30704:20::-;;;;;-1:-1:-1;;;;;30704:20:0;;;20889:104;;;:::i;23391:295::-;;;;;;:::i;:::-;;:::i;25678:287::-;;;;;;:::i;:::-;;:::i;21666:121::-;;;;;;:::i;:::-;21732:7;21759:20;;;:11;:20;;;;;;;21666:121;32154:368;;;;;;:::i;:::-;;:::i;21001:552::-;;;;;;:::i;:::-;;:::i;30670:27::-;;;;;;21795:118;;;;;;:::i;:::-;21861:7;21888:17;;;:8;:17;;;;;;-1:-1:-1;;;;;21888:17:0;;21795:118;23973:164;;;;;;:::i;:::-;-1:-1:-1;;;;;24094:25:0;;;24070:4;24094:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23973:164;31183:269;;;;;;:::i;:::-;;:::i;20781:100::-;20835:13;20868:5;20861:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20781:100;:::o;22808:221::-;22884:7;22912:16;22920:7;22912;:16::i;:::-;22904:73;;;;-1:-1:-1;;;22904:73:0;;14490:2:1;22904:73:0;;;14472:21:1;14529:2;14509:18;;;14502:30;14568:34;14548:18;;;14541:62;-1:-1:-1;;;14619:18:1;;;14612:42;14671:19;;22904:73:0;;;;;;;;;-1:-1:-1;22997:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22997:24:0;;22808:221::o;22396:404::-;22477:13;22493:23;22508:7;22493:14;:23::i;:::-;22477:39;;22541:5;-1:-1:-1;;;;;22535:11:0;:2;-1:-1:-1;;;;;22535:11:0;;;22527:57;;;;-1:-1:-1;;;22527:57:0;;16857:2:1;22527:57:0;;;16839:21:1;16896:2;16876:18;;;16869:30;16935:34;16915:18;;;16908:62;-1:-1:-1;;;16986:18:1;;;16979:31;17027:19;;22527:57:0;16829:223:1;22527:57:0;17989:10;-1:-1:-1;;;;;22605:21:0;;;;:69;;-1:-1:-1;22630:44:0;22654:5;17989:10;23973:164;:::i;22630:44::-;22597:161;;;;-1:-1:-1;;;22597:161:0;;12531:2:1;22597:161:0;;;12513:21:1;12570:2;12550:18;;;12543:30;12609:34;12589:18;;;12582:62;12680:26;12660:18;;;12653:54;12724:19;;22597:161:0;12503:246:1;22597:161:0;22771:21;22780:2;22784:7;22771:8;:21::i;:::-;22396:404;;;:::o;22091:117::-;22152:7;22179:21;:12;:19;:21::i;:::-;22172:28;;22091:117;:::o;24145:252::-;24253:41;17989:10;24286:7;24253:18;:41::i;:::-;24245:103;;;;-1:-1:-1;;;24245:103:0;;;;;;;:::i;:::-;24361:28;24371:4;24377:2;24381:7;24361:9;:28::i;21921:162::-;-1:-1:-1;;;;;22045:20:0;;22018:7;22045:20;;;:13;:20;;;;;:30;;22069:5;22045:23;:30::i;:::-;22038:37;;21921:162;;;;;:::o;24405:151::-;24509:39;24526:4;24532:2;24536:7;24509:39;;;;;;;;;;;;:16;:39::i;32642:136::-;32699:16;32707:7;32699;:16::i;:::-;32691:54;;;;-1:-1:-1;;;32691:54:0;;16503:2:1;32691:54:0;;;16485:21:1;16542:2;16522:18;;;16515:30;16581:27;16561:18;;;16554:55;16626:18;;32691:54:0;16475:175:1;32691:54:0;32756:14;32762:7;32756:5;:14::i;:::-;32642:136;:::o;22216:172::-;22291:7;;22333:22;:12;22349:5;22333:15;:22::i;:::-;-1:-1:-1;22311:44:0;22216:172;-1:-1:-1;;;22216:172:0:o;32530:100::-;31099:5;;-1:-1:-1;;;;;31099:5:0;31108:10;31099:19;31091:64;;;;-1:-1:-1;;;31091:64:0;;15316:2:1;31091:64:0;;;15298:21:1;;;15335:18;;;15328:30;15394:34;15374:18;;;15367:62;15446:18;;31091:64:0;15288:182:1;31091:64:0;32601:21:::1;32613:8;32601:11;:21::i;20596:177::-:0;20668:7;20695:70;20712:7;20695:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;21561:97::-;21609:13;21642:8;21635:15;;;;;:::i;20180:221::-;20252:7;-1:-1:-1;;;;;20280:19:0;;20272:74;;;;-1:-1:-1;;;20272:74:0;;12956:2:1;20272:74:0;;;12938:21:1;12995:2;12975:18;;;12968:30;13034:34;13014:18;;;13007:62;-1:-1:-1;;;13085:18:1;;;13078:40;13135:19;;20272:74:0;12928:232:1;20272:74:0;-1:-1:-1;;;;;20364:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;20889:104::-;20945:13;20978:7;20971:14;;;;;:::i;23391:295::-;-1:-1:-1;;;;;23494:24:0;;17989:10;23494:24;;23486:62;;;;-1:-1:-1;;;23486:62:0;;11357:2:1;23486:62:0;;;11339:21:1;11396:2;11376:18;;;11369:30;11435:27;11415:18;;;11408:55;11480:18;;23486:62:0;11329:175:1;23486:62:0;17989:10;23561:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23561:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23561:53:0;;;;;;;;;;23630:48;;8140:41:1;;;23561:42:0;;17989:10;23630:48;;8113:18:1;23630:48:0;;;;;;;23391:295;;:::o;25678:287::-;25810:41;17989:10;25843:7;25810:18;:41::i;:::-;25802:103;;;;-1:-1:-1;;;25802:103:0;;;;;;;:::i;:::-;25916:39;25930:4;25936:2;25940:7;25949:5;25916:13;:39::i;:::-;25678:287;;;;:::o;32154:368::-;32292:12;;32252:7;;32315:38;32326:8;32336:10;32348:4;32315:10;:38::i;:::-;32364:37;32374:10;32386:9;32397:3;32364:9;:37::i;:::-;32412:33;32425:9;32436:8;32412:12;:33::i;:::-;32471:12;;:16;;32486:1;32471:16;:::i;:::-;32456:12;:31;32505:9;-1:-1:-1;32154:368:0;;;;;;:::o;21001:552::-;21074:13;21108:16;21116:7;21108;:16::i;:::-;21100:76;;;;-1:-1:-1;;;21100:76:0;;16087:2:1;21100:76:0;;;16069:21:1;16126:2;16106:18;;;16099:30;16165:34;16145:18;;;16138:62;-1:-1:-1;;;16216:18:1;;;16209:45;16271:19;;21100:76:0;16059:237:1;21100:76:0;21189:23;21215:19;;;:10;:19;;;;;21189:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21245:18;21266:9;:7;:9::i;:::-;21245:30;;21298:4;21292:18;21314:1;21292:23;21288:72;;;-1:-1:-1;21339:9:0;21001:552;-1:-1:-1;;21001:552:0:o;21288:72::-;21374:23;;:27;21370:108;;21449:4;21455:9;21432:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21418:48;;;;21001:552;;;:::o;21370:108::-;21519:4;21525:18;:7;:16;:18::i;:::-;21502:42;;;;;;;;;:::i;31183:269::-;31099:5;;31253:4;;-1:-1:-1;;;;;31099:5:0;31108:10;31099:19;31091:64;;;;-1:-1:-1;;;31091:64:0;;15316:2:1;31091:64:0;;;15298:21:1;;;15335:18;;;15328:30;15394:34;15374:18;;;15367:62;15446:18;;31091:64:0;15288:182:1;31091:64:0;-1:-1:-1;;;;;31277:22:0;::::1;31269:73;;;::::0;-1:-1:-1;;;31269:73:0;;9843:2:1;31269:73:0::1;::::0;::::1;9825:21:1::0;9882:2;9862:18;;;9855:30;9921:34;9901:18;;;9894:62;-1:-1:-1;;;9972:18:1;;;9965:36;10018:19;;31269:73:0::1;9815:228:1::0;31269:73:0::1;31379:5;::::0;31358:37:::1;::::0;-1:-1:-1;;;;;31358:37:0;;::::1;::::0;31379:5:::1;::::0;31358:37:::1;::::0;31379:5:::1;::::0;31358:37:::1;-1:-1:-1::0;31406:5:0::1;:16:::0;;-1:-1:-1;;;;;;31406:16:0::1;-1:-1:-1::0;;;;;31406:16:0;::::1;;::::0;;-1:-1:-1;31166:1:0::1;31183:269:::0;;;:::o;26253:127::-;26318:4;26342:30;:12;26364:7;26342:21;:30::i;30334:192::-;30409:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30409:29:0;-1:-1:-1;;;;;30409:29:0;;;;;;;;:24;;30463:23;30409:24;30463:14;:23::i;:::-;-1:-1:-1;;;;;30454:46:0;;;;;;;;;;;30334:192;;:::o;4097:123::-;4166:7;4193:19;4201:3;2250:19;;2167:110;26388:355;26481:4;26506:16;26514:7;26506;:16::i;:::-;26498:73;;;;-1:-1:-1;;;26498:73:0;;12118:2:1;26498:73:0;;;12100:21:1;12157:2;12137:18;;;12130:30;12196:34;12176:18;;;12169:62;-1:-1:-1;;;12247:18:1;;;12240:42;12299:19;;26498:73:0;12090:234:1;26498:73:0;26582:13;26598:23;26613:7;26598:14;:23::i;:::-;26582:39;;26651:5;-1:-1:-1;;;;;26640:16:0;:7;-1:-1:-1;;;;;26640:16:0;;:51;;;;26684:7;-1:-1:-1;;;;;26660:31:0;:20;26672:7;26660:11;:20::i;:::-;-1:-1:-1;;;;;26660:31:0;;26640:51;:94;;;-1:-1:-1;;;;;;24094:25:0;;;24070:4;24094:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26695:39;26632:103;26388:355;-1:-1:-1;;;;26388:355:0:o;28510:547::-;28635:4;-1:-1:-1;;;;;28608:31:0;:23;28623:7;28608:14;:23::i;:::-;-1:-1:-1;;;;;28608:31:0;;28600:85;;;;-1:-1:-1;;;28600:85:0;;15677:2:1;28600:85:0;;;15659:21:1;15716:2;15696:18;;;15689:30;15755:34;15735:18;;;15728:62;-1:-1:-1;;;15806:18:1;;;15799:39;15855:19;;28600:85:0;15649:231:1;28600:85:0;-1:-1:-1;;;;;28722:16:0;;28714:65;;;;-1:-1:-1;;;28714:65:0;;10952:2:1;28714:65:0;;;10934:21:1;10991:2;10971:18;;;10964:30;11030:34;11010:18;;;11003:62;-1:-1:-1;;;11081:18:1;;;11074:34;11125:19;;28714:65:0;10924:226:1;28714:65:0;28844:29;28861:1;28865:7;28844:8;:29::i;:::-;-1:-1:-1;;;;;28886:19:0;;;;;;:13;:19;;;;;:35;;28913:7;28886:26;:35::i;:::-;-1:-1:-1;;;;;;28932:17:0;;;;;;:13;:17;;;;;:30;;28954:7;28932:21;:30::i;:::-;-1:-1:-1;28975:29:0;:12;28992:7;29001:2;28975:16;:29::i;:::-;;29041:7;29037:2;-1:-1:-1;;;;;29022:27:0;29031:4;-1:-1:-1;;;;;29022:27:0;;;;;;;;;;;28510:547;;;:::o;8895:137::-;8966:7;9001:22;9005:3;9017:5;9001:3;:22::i;27952:550::-;28034:16;28042:7;28034;:16::i;:::-;-1:-1:-1;;;;;28020:30:0;:10;-1:-1:-1;;;;;28020:30:0;;28012:58;;;;-1:-1:-1;;;28012:58:0;;10607:2:1;28012:58:0;;;10589:21:1;10646:2;10626:18;;;10619:30;-1:-1:-1;;;10665:18:1;;;10658:46;10721:18;;28012:58:0;10579:166:1;28012:58:0;28081:13;28097:23;28112:7;28097:14;:23::i;:::-;28081:39;;28212:29;28229:1;28233:7;28212:8;:29::i;:::-;28264:19;;;;:10;:19;;;;;28258:33;;;;;:::i;:::-;:38;;-1:-1:-1;28254:97:0;;28320:19;;;;:10;:19;;;;;28313:26;;;:::i;:::-;-1:-1:-1;;;;;28363:20:0;;;;;;:13;:20;;;;;:36;;28391:7;28363:27;:36::i;:::-;-1:-1:-1;28412:28:0;:12;28432:7;28412:19;:28::i;:::-;-1:-1:-1;28458:36:0;;28486:7;;28482:1;;-1:-1:-1;;;;;28458:36:0;;;;;28482:1;;28458:36;27952:550;;:::o;4228:236::-;4308:7;;;;4368:22;4372:3;4384:5;4368:3;:22::i;:::-;4337:53;;;;-1:-1:-1;4228:236:0;-1:-1:-1;;;;;4228:236:0:o;29576:138::-;29649:19;;;;:8;;:19;;;;;:::i;:::-;;29684:22;29697:8;29684:22;;;;;;:::i;:::-;;;;;;;;29576:138;:::o;4901:213::-;5008:7;5059:44;5064:3;5084;5090:12;5059:4;:44::i;25973:272::-;26087:28;26097:4;26103:2;26107:7;26087:9;:28::i;:::-;26134:48;26157:4;26163:2;26167:7;26176:5;26134:22;:48::i;:::-;26126:111;;;;-1:-1:-1;;;26126:111:0;;9424:2:1;26126:111:0;;;9406:21:1;9463:2;9443:18;;;9436:30;9502:34;9482:18;;;9475:62;-1:-1:-1;;;9553:18:1;;;9546:48;9611:19;;26126:111:0;9396:240:1;31460:344:0;31563:12;31605:4;31611:6;31619:8;31588:40;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31578:51;;;;;;31563:66;;31657:104;31730:4;31677:58;;;;;;;7140:66:1;7128:79;;7232:2;7223:12;;7216:28;;;;7269:2;7260:12;;7118:160;31677:58:0;;;;-1:-1:-1;;31677:58:0;;;;;;;;;31667:69;;31677:58;31667:69;;;;31738:6;;31746;;;;31754;;;;31738;31657:104;;;;;;;;8419:25:1;;;;8492:4;8480:17;8460:18;;;8453:45;;;;8514:18;;;8507:34;;;;8557:18;;;8550:34;8391:19;;31657:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31657:104:0;;-1:-1:-1;;31657:104:0;;31648:5;;-1:-1:-1;;;;;31648:5:0;;;:113;;;;-1:-1:-1;31640:156:0;;;;-1:-1:-1;;;31640:156:0;;13367:2:1;31640:156:0;;;13349:21:1;13406:2;13386:18;;;13379:30;13445:32;13425:18;;;13418:60;13495:18;;31640:156:0;13339:180:1;26751:128:0;26840:31;26850:2;26854:7;26863:3;26840:31;;;;;;;;;;;;:9;:31::i;29313:255::-;29413:16;29421:7;29413;:16::i;:::-;29405:73;;;;-1:-1:-1;;;29405:73:0;;14903:2:1;29405:73:0;;;14885:21:1;14942:2;14922:18;;;14915:30;14981:34;14961:18;;;14954:62;-1:-1:-1;;;15032:18:1;;;15025:42;15084:19;;29405:73:0;14875:234:1;29405:73:0;29489:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;:::-;;29552:7;29537:23;29541:9;29537:23;;;;;;:::i;:::-;;;;;;;;29313:255;;:::o;91:557::-;147:13;179:10;175:53;;-1:-1:-1;;206:10:0;;;;;;;;;;;;-1:-1:-1;;;206:10:0;;;;;91:557::o;175:53::-;253:5;238:12;294:78;301:9;;294:78;;327:8;;;;:::i;:::-;;-1:-1:-1;350:10:0;;-1:-1:-1;358:2:0;350:10;;:::i;:::-;;;294:78;;;382:19;414:6;404:17;;;;;;-1:-1:-1;;;404:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;404:17:0;-1:-1:-1;382:39:0;-1:-1:-1;432:13:0;448:10;457:1;448:6;:10;:::i;:::-;432:26;;476:5;469:12;;492:117;499:9;;492:117;;561:9;568:2;561:4;:9;:::i;:::-;556:14;;:2;:14;:::i;:::-;543:29;;525:6;532:7;;;;:::i;:::-;;;525:15;;;;;;-1:-1:-1;;;525:15:0;;;;;;;;;;;;:47;-1:-1:-1;;;;;525:47:0;;;;;;;;-1:-1:-1;587:10:0;595:2;587:10;;:::i;:::-;;;492:117;;;-1:-1:-1;633:6:0;91:557;-1:-1:-1;;;;91:557:0:o;3938:151::-;4022:4;2129:17;;;:12;;;:17;;;;;;:22;;4046:35;2034:125;8474:137;8544:4;8568:35;8576:3;8596:5;8568:7;:35::i;8335:131::-;8402:4;8426:32;8431:3;8451:5;8426:4;:32::i;3595:185::-;3684:4;3708:64;3713:3;3733;-1:-1:-1;;;;;3747:23:0;;3708:4;:64::i;6485:204::-;6580:18;;6552:7;;6580:26;-1:-1:-1;6572:73:0;;;;-1:-1:-1;;;6572:73:0;;9021:2:1;6572:73:0;;;9003:21:1;9060:2;9040:18;;;9033:30;9099:34;9079:18;;;9072:62;-1:-1:-1;;;9150:18:1;;;9143:32;9192:19;;6572:73:0;8993:224:1;6572:73:0;6663:3;:11;;6675:5;6663:18;;;;;;-1:-1:-1;;;6663:18:0;;;;;;;;;;;;;;;;;6656:25;;6485:204;;;;:::o;3788:142::-;3865:4;3889:33;3897:3;3917;3889:7;:33::i;2285:279::-;2389:19;;2352:7;;;;2389:27;-1:-1:-1;2381:74:0;;;;-1:-1:-1;;;2381:74:0;;13726:2:1;2381:74:0;;;13708:21:1;13765:2;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;-1:-1:-1;;;13855:18:1;;;13848:32;13897:19;;2381:74:0;13698:224:1;2381:74:0;2468:22;2493:3;:12;;2506:5;2493:19;;;;;;-1:-1:-1;;;2493:19:0;;;;;;;;;;;;;;;;;;;2468:44;;2531:5;:10;;;2543:5;:12;;;2523:33;;;;;2285:279;;;;;:::o;3207:319::-;3301:7;3340:17;;;:12;;;:17;;;;;;3391:12;3376:13;3368:36;;;;-1:-1:-1;;;3368:36:0;;;;;;;;:::i;:::-;-1:-1:-1;3458:3:0;3471:12;3482:1;3471:8;:12;:::i;:::-;3458:26;;;;;;-1:-1:-1;;;3458:26:0;;;;;;;;;;;;;;;;;;;:33;;;3451:40;;;3207:319;;;;;:::o;29722:604::-;29843:4;-1:-1:-1;;;;;29870:13:0;;9183:20;29865:60;;-1:-1:-1;29909:4:0;29902:11;;29865:60;29935:23;29961:252;-1:-1:-1;;;17989:10:0;30101:4;30120:7;30142:5;29977:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;29977:181:0;;;;;;;-1:-1:-1;;;;;29977:181:0;;;;;;;;;;;29961:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29961:15:0;;;:252;:15;:252::i;:::-;29935:278;;30224:13;30251:10;30240:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;30291:26:0;-1:-1:-1;;;30291:26:0;;-1:-1:-1;;;29722:604:0;;;;;;:::o;26887:268::-;26996:23;27002:2;27006:7;27015:3;26996:5;:23::i;:::-;27038:54;27069:1;27073:2;27077:7;27086:5;27038:22;:54::i;5552:671::-;5618:4;5656:19;;;:12;;;:19;;;;;;5692:15;;5688:528;;5762:21;5786:14;5799:1;5786:10;:14;:::i;:::-;5835:18;;5762:38;;-1:-1:-1;5815:17:0;;5835:22;;5856:1;;5835:22;:::i;:::-;5815:42;;5872:17;5892:3;:11;;5904:9;5892:22;;;;;;-1:-1:-1;;;5892:22:0;;;;;;;;;;;;;;;;;5872:42;;5960:9;5931:3;:11;;5943:13;5931:26;;;;;;-1:-1:-1;;;5931:26:0;;;;;;;;;;;;;;;;;;:38;6010:17;:13;6026:1;6010:17;:::i;:::-;5984:23;;;;:12;;;:23;;;;;:43;6071:17;;5984:3;;6071:17;;;-1:-1:-1;;;6071:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;6112:3;:12;;:19;6125:5;6112:19;;;;;;;;;;;6105:26;;;6155:4;6148:11;;;;;;;;5688:528;6199:5;6192:12;;;;;5253:291;5316:4;2129:17;;;:12;;;:17;;;;;;5333:204;;-1:-1:-1;5376:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;5436:18;;5414:19;;;:12;;;:19;;;;;;:40;;;;5469:11;;5333:204;-1:-1:-1;5520:5:0;5513:12;;873:470;949:4;985:17;;;:12;;;:17;;;;;;1019:13;1015:321;;-1:-1:-1;;1104:38:0;;;;;;;;;;;;;;;;;;1086:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;1178:19;;1158:17;;;:12;;;:17;;;;;;;:39;1212:11;;1015:321;1292:5;1256:3;1269:12;1280:1;1269:8;:12;:::i;:::-;1256:26;;;;;;-1:-1:-1;;;1256:26:0;;;;;;;;;;;;;;;;;;;:33;;:41;;;;1319:5;1312:12;;;;;1351:675;1415:4;1451:17;;;:12;;;:17;;;;;;1485:13;;1481:538;;1551:21;1575:12;1586:1;1575:8;:12;:::i;:::-;1622:19;;1551:36;;-1:-1:-1;1602:17:0;;1622:23;;1644:1;;1622:23;:::i;:::-;1602:43;;1660:26;1689:3;:12;;1702:9;1689:23;;;;;;-1:-1:-1;;;1689:23:0;;;;;;;;;;;;;;;;;;;1660:52;;1759:9;1729:3;:12;;1742:13;1729:27;;;;;;-1:-1:-1;;;1729:27:0;;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;1814:17;;:13;;:17;:::i;:::-;1796:14;;1783:28;;;;:12;;;:28;;;;;:48;1875:18;;1783:3;;1875:18;;;-1:-1:-1;;;1875:18:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;1875:18:0;;;;;;;;;;;;;;;;;;;;;1917:17;;;:12;;;:17;;;;;;1910:24;;;;1875:18;-1:-1:-1;1951:11:0;;-1:-1:-1;;;;1951:11:0;9754:195;9857:12;9889:52;9911:6;9919:4;9925:1;9928:12;9889:21;:52::i;27163:504::-;-1:-1:-1;;;;;27256:16:0;;27248:61;;;;-1:-1:-1;;;27248:61:0;;14129:2:1;27248:61:0;;;14111:21:1;;;14148:18;;;14141:30;14207:34;14187:18;;;14180:62;14259:18;;27248:61:0;14101:182:1;27248:61:0;27329:16;27337:7;27329;:16::i;:::-;27328:17;27320:58;;;;-1:-1:-1;;;27320:58:0;;10250:2:1;27320:58:0;;;10232:21:1;10289:2;10269:18;;;10262:30;10328;10308:18;;;10301:58;10376:18;;27320:58:0;10222:178:1;27320:58:0;-1:-1:-1;;;;;27449:17:0;;;;;;:13;:17;;;;;:30;;27471:7;27449:21;:30::i;:::-;-1:-1:-1;27492:29:0;:12;27509:7;27518:2;27492:16;:29::i;:::-;-1:-1:-1;27532:17:0;;;;:8;:17;;;;;;;;:30;;-1:-1:-1;;;;;;27532:30:0;27552:10;27532:30;;;27573:11;:20;;;;;;:26;;;27617:33;27541:7;;-1:-1:-1;;;;;27617:33:0;;;;;27532:17;;27617:33;27163:504;;;:::o;10191:470::-;10318:12;10376:5;10351:21;:30;;10343:81;;;;-1:-1:-1;;;10343:81:0;;11711:2:1;10343:81:0;;;11693:21:1;11750:2;11730:18;;;11723:30;11789:34;11769:18;;;11762:62;-1:-1:-1;;;11840:18:1;;;11833:36;11886:19;;10343:81:0;11683:228:1;10343:81:0;9183:20;;10435:60;;;;-1:-1:-1;;;10435:60:0;;17677:2:1;10435:60:0;;;17659:21:1;17716:2;17696:18;;;17689:30;17755:31;17735:18;;;17728:59;17804:18;;10435:60:0;17649:179:1;10435:60:0;10509:12;10523:23;10550:6;-1:-1:-1;;;;;10550:11:0;10570:5;10578:4;10550:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10508:75;;;;10601:52;10619:7;10628:10;10640:12;10601:17;:52::i;:::-;10594:59;10191:470;-1:-1:-1;;;;;;;10191:470:0:o;11825:515::-;11940:12;11969:7;11965:368;;;-1:-1:-1;12000:10:0;11993:17;;11965:368;12047:17;;:21;12043:279;;12150:10;12144:17;12211:15;12198:10;12194:2;12190:19;12183:44;12098:148;12293:12;12286:20;;-1:-1:-1;;;12286:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;828:229;871:5;924:3;917:4;909:6;905:17;901:27;891:2;;946:5;939;932:20;891:2;972:79;1047:3;1038:6;1025:20;1018:4;1010:6;1006:17;972:79;:::i;1062:196::-;1121:6;1174:2;1162:9;1153:7;1149:23;1145:32;1142:2;;;1195:6;1187;1180:22;1142:2;1223:29;1242:9;1223:29;:::i;1263:270::-;1331:6;1339;1392:2;1380:9;1371:7;1367:23;1363:32;1360:2;;;1413:6;1405;1398:22;1360:2;1441:29;1460:9;1441:29;:::i;:::-;1431:39;;1489:38;1523:2;1512:9;1508:18;1489:38;:::i;:::-;1479:48;;1350:183;;;;;:::o;1538:338::-;1615:6;1623;1631;1684:2;1672:9;1663:7;1659:23;1655:32;1652:2;;;1705:6;1697;1690:22;1652:2;1733:29;1752:9;1733:29;:::i;:::-;1723:39;;1781:38;1815:2;1804:9;1800:18;1781:38;:::i;:::-;1771:48;;1866:2;1855:9;1851:18;1838:32;1828:42;;1642:234;;;;;:::o;1881:696::-;1976:6;1984;1992;2000;2053:3;2041:9;2032:7;2028:23;2024:33;2021:2;;;2075:6;2067;2060:22;2021:2;2103:29;2122:9;2103:29;:::i;:::-;2093:39;;2151:38;2185:2;2174:9;2170:18;2151:38;:::i;:::-;2141:48;;2236:2;2225:9;2221:18;2208:32;2198:42;;2291:2;2280:9;2276:18;2263:32;2318:18;2310:6;2307:30;2304:2;;;2355:6;2347;2340:22;2304:2;2383:22;;2436:4;2428:13;;2424:27;-1:-1:-1;2414:2:1;;2470:6;2462;2455:22;2414:2;2498:73;2563:7;2558:2;2545:16;2540:2;2536;2532:11;2498:73;:::i;:::-;2488:83;;;2011:566;;;;;;;:::o;2582:367::-;2647:6;2655;2708:2;2696:9;2687:7;2683:23;2679:32;2676:2;;;2729:6;2721;2714:22;2676:2;2757:29;2776:9;2757:29;:::i;:::-;2747:39;;2836:2;2825:9;2821:18;2808:32;2883:5;2876:13;2869:21;2862:5;2859:32;2849:2;;2910:6;2902;2895:22;2849:2;2938:5;2928:15;;;2666:283;;;;;:::o;2954:264::-;3022:6;3030;3083:2;3071:9;3062:7;3058:23;3054:32;3051:2;;;3104:6;3096;3089:22;3051:2;3132:29;3151:9;3132:29;:::i;:::-;3122:39;3208:2;3193:18;;;;3180:32;;-1:-1:-1;;;3041:177:1:o;3223:255::-;3281:6;3334:2;3322:9;3313:7;3309:23;3305:32;3302:2;;;3355:6;3347;3340:22;3302:2;3399:9;3386:23;3418:30;3442:5;3418:30;:::i;3483:259::-;3552:6;3605:2;3593:9;3584:7;3580:23;3576:32;3573:2;;;3626:6;3618;3611:22;3573:2;3663:9;3657:16;3682:30;3706:5;3682:30;:::i;3747:342::-;3816:6;3869:2;3857:9;3848:7;3844:23;3840:32;3837:2;;;3890:6;3882;3875:22;3837:2;3935:9;3922:23;3968:18;3960:6;3957:30;3954:2;;;4005:6;3997;3990:22;3954:2;4033:50;4075:7;4066:6;4055:9;4051:22;4033:50;:::i;4094:1064::-;4203:6;4211;4219;4263:9;4254:7;4250:23;4293:3;4289:2;4285:12;4282:2;;;4315:6;4307;4300:22;4282:2;4360:9;4347:23;4389:18;4430:2;4422:6;4419:14;4416:2;;;4451:6;4443;4436:22;4416:2;4479:50;4521:7;4512:6;4501:9;4497:22;4479:50;:::i;:::-;4469:60;-1:-1:-1;4576:2:1;4561:18;;4548:32;;-1:-1:-1;4614:4:1;-1:-1:-1;;4596:16:1;;4592:27;4589:2;;;4637:6;4629;4622:22;4589:2;4675;4669:9;4655:23;;4717:4;4709:6;4705:17;4687:35;;4772:6;4760:10;4757:22;4752:2;4740:10;4737:18;4734:46;4731:2;;;4783:18;;:::i;:::-;-1:-1:-1;4819:2:1;4812:22;;;4869:18;;4856:32;4928:4;4917:16;;4907:27;;4897:2;;4953:6;4945;4938:22;4897:2;4971:21;;5053:4;5038:20;;5025:34;5020:2;5008:15;;5001:59;5121:3;5106:19;;;5093:33;5088:2;5076:15;;5069:58;-1:-1:-1;4230:928:1;;;;-1:-1:-1;4230:928:1:o;5163:190::-;5222:6;5275:2;5263:9;5254:7;5250:23;5246:32;5243:2;;;5296:6;5288;5281:22;5243:2;-1:-1:-1;5324:23:1;;5233:120;-1:-1:-1;5233:120:1:o;5358:257::-;5399:3;5437:5;5431:12;5464:6;5459:3;5452:19;5480:63;5536:6;5529:4;5524:3;5520:14;5513:4;5506:5;5502:16;5480:63;:::i;:::-;5597:2;5576:15;-1:-1:-1;;5572:29:1;5563:39;;;;5604:4;5559:50;;5407:208;-1:-1:-1;;5407:208:1:o;5620:274::-;5749:3;5787:6;5781:13;5803:53;5849:6;5844:3;5837:4;5829:6;5825:17;5803:53;:::i;:::-;5872:16;;;;;5757:137;-1:-1:-1;;5757:137:1:o;5899:519::-;6104:3;6136:26;6132:31;6205:2;6196:6;6192:2;6188:15;6184:24;6179:3;6172:37;6260:2;6251:6;6247:2;6243:15;6239:24;6234:2;6229:3;6225:12;6218:46;;6293:6;6287:13;6309:62;6364:6;6359:2;6354:3;6350:12;6343:4;6335:6;6331:17;6309:62;:::i;:::-;6391:16;;;;6409:2;6387:25;;6112:306;-1:-1:-1;;;;6112:306:1:o;6423:470::-;6602:3;6640:6;6634:13;6656:53;6702:6;6697:3;6690:4;6682:6;6678:17;6656:53;:::i;:::-;6772:13;;6731:16;;;;6794:57;6772:13;6731:16;6828:4;6816:17;;6794:57;:::i;:::-;6867:20;;6610:283;-1:-1:-1;;;;6610:283:1:o;7491:504::-;-1:-1:-1;;;;;7776:15:1;;;7758:34;;7828:15;;7823:2;7808:18;;7801:43;7875:2;7860:18;;7853:34;;;7923:3;7918:2;7903:18;;7896:31;;;7701:4;;7944:45;;7969:19;;7961:6;7944:45;:::i;:::-;7936:53;7710:285;-1:-1:-1;;;;;;7710:285:1:o;8595:219::-;8744:2;8733:9;8726:21;8707:4;8764:44;8804:2;8793:9;8789:18;8781:6;8764:44;:::i;17057:413::-;17259:2;17241:21;;;17298:2;17278:18;;;17271:30;17337:34;17332:2;17317:18;;17310:62;-1:-1:-1;;;17403:2:1;17388:18;;17381:47;17460:3;17445:19;;17231:239::o;18015:128::-;18055:3;18086:1;18082:6;18079:1;18076:13;18073:2;;;18092:18;;:::i;:::-;-1:-1:-1;18128:9:1;;18063:80::o;18148:120::-;18188:1;18214;18204:2;;18219:18;;:::i;:::-;-1:-1:-1;18253:9:1;;18194:74::o;18273:125::-;18313:4;18341:1;18338;18335:8;18332:2;;;18346:18;;:::i;:::-;-1:-1:-1;18383:9:1;;18322:76::o;18403:258::-;18475:1;18485:113;18499:6;18496:1;18493:13;18485:113;;;18575:11;;;18569:18;18556:11;;;18549:39;18521:2;18514:10;18485:113;;;18616:6;18613:1;18610:13;18607:2;;;-1:-1:-1;;18651:1:1;18633:16;;18626:27;18456:205::o;18666:136::-;18705:3;18733:5;18723:2;;18742:18;;:::i;:::-;-1:-1:-1;;;18778:18:1;;18713:89::o;18807:380::-;18886:1;18882:12;;;;18929;;;18950:2;;19004:4;18996:6;18992:17;18982:27;;18950:2;19057;19049:6;19046:14;19026:18;19023:38;19020:2;;;19103:10;19098:3;19094:20;19091:1;19084:31;19138:4;19135:1;19128:15;19166:4;19163:1;19156:15;19020:2;;18862:325;;;:::o;19192:135::-;19231:3;-1:-1:-1;;19252:17:1;;19249:2;;;19272:18;;:::i;:::-;-1:-1:-1;19319:1:1;19308:13;;19239:88::o;19332:112::-;19364:1;19390;19380:2;;19395:18;;:::i;:::-;-1:-1:-1;19429:9:1;;19370:74::o;19449:127::-;19510:10;19505:3;19501:20;19498:1;19491:31;19541:4;19538:1;19531:15;19565:4;19562:1;19555:15;19581:127;19642:10;19637:3;19633:20;19630:1;19623:31;19673:4;19670:1;19663:15;19697:4;19694:1;19687:15;19713:127;19774:10;19769:3;19765:20;19762:1;19755:31;19805:4;19802:1;19795:15;19829:4;19826:1;19819:15;19845:131;-1:-1:-1;;;;;;19919:32:1;;19909:43;;19899:2;;19966:1;19963;19956:12

Swarm Source

ipfs://8273779b97c6bc12ad70f91ad5b02a1483241e038dd85eba2cc65eb51df86c6d
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.