ETH Price: $3,254.85 (+2.50%)
Gas: 3 Gwei

Token

SatoshiFinanceToken (SFT)
 

Overview

Max Total Supply

1,878,815.140976388888887978 SFT

Holders

242 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
588.576967592592592592 SFT

Value
$0.00
0x418eced7262261c57c78de9396b86a580c556fe4
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The SatoshiFinanceToken (SFT) is the utility token for the SatoshiFaces ecosystem. SatoshiFaces are a collection of 4999 unique NFT artworks created by renowned British artist Ed Merlin Murray.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SFT

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 10 of 10: SFT.sol
pragma solidity ^0.7.0;

import "./IERC165.sol";
import "./SafeMath.sol";
import "./IERC20.sol";
import "./ISFT.sol";
import "./IFaces.sol";
import "./Context.sol";
import "./Ownable.sol";

/**
 *
 * SFT Contract (The native token of SatoshiFaces)
 * @dev Extends standard ERC20 contract
 */
contract SFT is Context, Ownable, ISFT {
    using SafeMath for uint256;

    // Constants
    uint256 public constant SECONDS_IN_A_DAY = 86400;
    uint256 public constant SECONDS_IN_A_YEAR = SECONDS_IN_A_DAY * 365;
    
    uint256 public constant INITIAL_ALLOTMENT = 500 * (10 ** 18);

    // Public variables
    uint256 public constant EMISSION_START = 1617667200; // Tuesday, April 6, 2021 0:00:00 GMT
    uint256 public constant EMISSION_END = EMISSION_START + (SECONDS_IN_A_YEAR * 10); // 10 years
    
    // emission rate decreases with a reduction factor of 0.75 per year
    uint256 public constant EMISSION_PER_DAY_YEAR_0 = 5.00 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_1 = 3.75 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_2 = 2.81 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_3 = 2.11 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_4 = 1.58 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_5 = 1.19 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_6 = 0.89 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_7 = 0.67 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_8 = 0.50 * (10 ** 18);
    uint256 public constant EMISSION_PER_DAY_YEAR_9 = 0.36 * (10 ** 18);
    
    uint256[10] public EMISSION_PER_DAY_YEARS = [  EMISSION_PER_DAY_YEAR_0, 
                                                EMISSION_PER_DAY_YEAR_1, 
                                                EMISSION_PER_DAY_YEAR_2,
                                                EMISSION_PER_DAY_YEAR_3,
                                                EMISSION_PER_DAY_YEAR_4,
                                                EMISSION_PER_DAY_YEAR_5,
                                                EMISSION_PER_DAY_YEAR_6,
                                                EMISSION_PER_DAY_YEAR_7,
                                                EMISSION_PER_DAY_YEAR_8,
                                                EMISSION_PER_DAY_YEAR_9];

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;
    
    mapping(uint256 => uint256) private _lastClaim;
    
    mapping(uint256 => uint256) private _claimedAmount;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;
    address private _facesAddress;
    address private _addonsAddress;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor () {
        _name = "SatoshiFinanceToken";
        _symbol = "SFT";
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }
    
    /**
     * @dev When accumulated SFTs have last been claimed for a SatoshiFaces index
     */
    function lastClaim(uint256 tokenIndex) public view returns (uint256) {
        require(IFaces(_facesAddress).ownerOf(tokenIndex) != address(0), "Owner cannot be 0 address");
        require(tokenIndex < IFaces(_facesAddress).totalSupply(), "NFT at index has not been minted yet");

        uint256 lastClaimed = uint256(_lastClaim[tokenIndex]) != 0 ? uint256(_lastClaim[tokenIndex]) : EMISSION_START;
        return lastClaimed;
    }
    
    /**
     * @dev Total accumulated SFT tokens for all existing SatoshiFace NFTs.
     */
    function totalAccumulatedSupply() public view override returns (uint256) {
        require(block.timestamp > EMISSION_START, "Emission has not started yet");
        require(IFaces(_facesAddress).ownerOf(0) != address(0), "Owner of NFT #0 cannot be 0 address");
        require(0 < IFaces(_facesAddress).totalSupply(), "No NFTs have been minted yet");
        
        uint256 nftSupply = IFaces(_facesAddress).totalSupply();
        return nftSupply.mul(totalAccumulated(0));
    }
    
    /**
     * @dev Accumulated SFT tokens for a SatoshiFaces token index.
     */
    function accumulated(uint256 tokenIndex) public view override returns (uint256) {
        require(block.timestamp > EMISSION_START, "Emission has not started yet");
        require(IFaces(_facesAddress).ownerOf(tokenIndex) != address(0), "Owner cannot be 0 address");
        require(tokenIndex < IFaces(_facesAddress).totalSupply(), "NFT at index has not been minted yet");

        uint256 lastClaimed = lastClaim(tokenIndex);

        // sanity check if last claim was on or after emission end
        if (lastClaimed >= EMISSION_END) return 0;

        uint256 accumulatedQty = totalAccumulated(tokenIndex).sub(totalClaimed(tokenIndex));
        return accumulatedQty;
    }
    
    /**
     * @dev Lifetime Accumulated SFT tokens for a SatoshiFaces token index.
     */
    function totalAccumulated(uint256 tokenIndex) public view override returns (uint256) {
        require(block.timestamp > EMISSION_START, "Emission has not started yet");
        require(IFaces(_facesAddress).ownerOf(tokenIndex) != address(0), "Owner cannot be 0 address");
        require(tokenIndex < IFaces(_facesAddress).totalSupply(), "NFT at index has not been minted yet");
        
        uint256 nowTime = block.timestamp < EMISSION_END ? block.timestamp : EMISSION_END;
        uint256 elapsedTime = nowTime.sub(EMISSION_START);
        uint256 yearsElapsed = elapsedTime.div(SECONDS_IN_A_YEAR);
        uint256 totalAmountAccumulated = 0;
        uint256 timeAccountedFor = 0;
        
        // amount accumulated in each year
        for(uint year = 0; year < yearsElapsed; year++) {
            uint256 emissionPerDayForYear = EMISSION_PER_DAY_YEARS[year];
            uint256 yearAccumulated = emissionPerDayForYear.mul(365);
            totalAmountAccumulated = totalAmountAccumulated.add(yearAccumulated);
            timeAccountedFor = timeAccountedFor.add(SECONDS_IN_A_YEAR);
        }
        // amount accumulated since last full year
        if(elapsedTime > timeAccountedFor && yearsElapsed < 10) {
            uint256 remainingTime = elapsedTime.sub(timeAccountedFor);
            uint256 currentEmissionRate = EMISSION_PER_DAY_YEARS[yearsElapsed];
            uint256 remainingAccumulated = remainingTime.mul(currentEmissionRate).div(SECONDS_IN_A_DAY);
            totalAmountAccumulated = totalAmountAccumulated.add(remainingAccumulated);
        }
        // add initial allotment
        totalAmountAccumulated = totalAmountAccumulated.add(INITIAL_ALLOTMENT);
        
        return totalAmountAccumulated;
    }
    
    /**
     * @dev Lifetime SFT tokens claimed from a token index SatoshiFaces NFT
     */
    function totalClaimed(uint256 tokenIndex) public view override returns (uint256) {
        require(IFaces(_facesAddress).ownerOf(tokenIndex) != address(0), "Owner cannot be 0 address");
        require(tokenIndex < IFaces(_facesAddress).totalSupply(), "NFT at index has not been minted yet");
        
        uint256 claimed = uint256(_claimedAmount[tokenIndex]) >= 0 ? uint256(_claimedAmount[tokenIndex]) : 0;
        return claimed;
    }

    /**
     * @dev Set right after deployment and verified
     */
    function setFacesAddress(address facesAddress) onlyOwner public {
        require(_facesAddress == address(0), "Already set");
        _facesAddress = facesAddress;
    }
    
    /**
     * @dev To be set at a later date when the platform is developed
     */
    function setAddonsAddress(address addonsAddress) onlyOwner public {
        _addonsAddress = addonsAddress;
    }
    
    /**
     * @dev Claim mints SFTs and supports multiple SatoshiFaces token indices at once.
     */
    function claim(uint256[] memory tokenIndices) public returns (uint256) {
        require(block.timestamp > EMISSION_START, "Emission has not started yet");

        uint256 totalClaimQty = 0;
        for (uint i = 0; i < tokenIndices.length; i++) {
            // Sanity check for non-minted index
            require(tokenIndices[i] < IFaces(_facesAddress).totalSupply(), "NFT at index has not been minted yet");
            // Duplicate token index check
            for (uint j = i + 1; j < tokenIndices.length; j++) {
                require(tokenIndices[i] != tokenIndices[j], "Duplicate token index");
            }

            uint tokenIndex = tokenIndices[i];
            require(IFaces(_facesAddress).ownerOf(tokenIndex) == msg.sender, "Sender is not the owner");

            uint256 claimQty = accumulated(tokenIndex);
            if (claimQty != 0) {
                _lastClaim[tokenIndex] = block.timestamp;
                uint256 alreadyClaimed = _claimedAmount[tokenIndex];
                _claimedAmount[tokenIndex] = alreadyClaimed.add(claimQty);
                totalClaimQty = totalClaimQty.add(claimQty);
            }
        }

        require(totalClaimQty != 0, "No accumulated SFT");
        _mint(msg.sender, totalClaimQty); 
        return totalClaimQty;
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        // Approval check is skipped if the caller of transferFrom is the SatoshiFaces or SatoshiFaces Addons contract. For better UX.
        if (msg.sender == _facesAddress) {
            // caller of transferFrom is the SatoshiFaces contract
        }
        else if(_addonsAddress != address(0) && msg.sender == _addonsAddress) {
            // addons contract address is set and caller is from the SatoshiFaces Addons contract
        }
        else {
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        }
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    // ++
    /**
     * @dev Burns a quantity of tokens held by the caller.
     *
     * Emits an {Transfer} event to 0 address
     *
     */
    function burn(uint256 burnQuantity) public virtual override returns (bool) {
        _burn(msg.sender, burnQuantity);
        return true;
    }
    // ++

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

File 1 of 10: Context.sol
/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return 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;
    }
}

File 2 of 10: IERC165.sol
pragma solidity ^0.7.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
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);
}

File 3 of 10: IERC20.sol
pragma solidity ^0.7.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);


    /**
     * TODO: Add comment
     */
    function burn(uint256 burnQuantity) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 10: IERC721.sol
import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

File 5 of 10: IERC721Enumerable.sol
import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 6 of 10: IFaces.sol
import "./IERC721Enumerable.sol";

interface IFaces is IERC721Enumerable {
    
    function mintedTimestampByIndex(uint256 index) external view returns (uint256);
    function segmentsUnlockedByIndex(uint256 index) external view returns (uint256);
    function tokenNameByIndex(uint256 index) external view returns (string memory);
    function isNameReserved(string memory nameString) external view returns (bool);
}

File 7 of 10: ISFT.sol
import "./IERC20.sol";

interface ISFT is IERC20 {
    
    function totalAccumulatedSupply() external view returns (uint256);
    
    function accumulated(uint256 tokenIndex) external view returns (uint256);
    function totalAccumulated(uint256 tokenIndex) external view returns (uint256);
    function totalClaimed(uint256 tokenIndex) external view returns (uint256);
}

File 8 of 10: Ownable.sol
pragma solidity ^0.7.0;

import "./Context.sol";

contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 9 of 10: SafeMath.sol
pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EMISSION_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"EMISSION_PER_DAY_YEARS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_PER_DAY_YEAR_9","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_ALLOTMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_A_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_A_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"accumulated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnQuantity","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIndices","type":"uint256[]"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"lastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addonsAddress","type":"address"}],"name":"setAddonsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"facesAddress","type":"address"}],"name":"setFacesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"totalAccumulated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAccumulatedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIndex","type":"uint256"}],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101c0604052674563918244f40000608090815267340aad21b3b7000060a0526726ff201caad9000060c052671d4839d21c13000060e0526715ed49a0f91e000061010052671083bab1f2b7000061012052670c59ea48da1900006101405267094c51733f830000610160526706f05b59d3b20000610180526704fefa17b72400006101a0526200009590600190600a62000184565b50348015620000a357600080fd5b506000620000b062000180565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805180820190915260138082527f5361746f73686946696e616e6365546f6b656e0000000000000000000000000060209092019182526200014091601091620001c7565b506040805180820190915260038082526214d19560ea1b60209092019182526200016d91601191620001c7565b506012805460ff19168117905562000250565b3390565b82600a8101928215620001b5579160200282015b82811115620001b557825182559160200191906001019062000198565b50620001c392915062000239565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200020a57805160ff1916838001178555620001b5565b82800160010185558215620001b55791820182811115620001b557825182559160200191906001019062000198565b5b80821115620001c357600081556001016200023a565b61247b80620002606000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80636ba4c1381161013b578063c4fa17a4116100b8578063e5acd8491161007c578063e5acd84914610663578063eaab2c3f1461066b578063eec4c0bf14610688578063f2fde38b14610690578063f9cfa06f146106b65761023d565b8063c4fa17a414610600578063c607cde714610608578063c78e1ca214610625578063dd62ed3e1461062d578063e00e79371461065b5761023d565b806395d89b41116100ff57806395d89b41146105905780639900a07f14610598578063a457c2d7146105a0578063a9059cbb146105cc578063a98c21d2146105f85761023d565b80636ba4c1381461049357806370a0823114610536578063715018a61461055c57806383e585aa146105645780638da5cb5b1461056c5761023d565b806323b872dd116101c95780633d3728b51161018d5780633d3728b51461042357806342966c681461044057806344de648f1461045d5780634c11764014610465578063661d906b1461048b5761023d565b806323b872dd146103935780632edbb9d3146103c9578063313ce567146103d1578063367df165146103ef57806339509351146103f75761023d565b8063118f5a1011610210578063118f5a1014610341578063147f8cfa1461034957806317ca9da81461035157806318160ddd1461036e5780631a6f3a04146103765761023d565b806303518a911461024257806306fdde031461026a578063095ea7b3146102e75780630fe3633c14610327575b600080fd5b6102686004803603602081101561025857600080fd5b50356001600160a01b03166106be565b005b610272610738565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ac578181015183820152602001610294565b50505050905090810190601f1680156102d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610313600480360360408110156102fd57600080fd5b506001600160a01b0381351690602001356107ce565b604080519115158252519081900360200190f35b61032f6107ec565b60408051918252519081900360200190f35b61032f6107f4565b61032f610800565b61032f6004803603602081101561036757600080fd5b503561080c565b61032f610820565b61032f6004803603602081101561038c57600080fd5b5035610826565b610313600480360360608110156103a957600080fd5b506001600160a01b03813581169160208101359091169060400135610b11565b61032f610be3565b6103d9610e53565b6040805160ff9092168252519081900360200190f35b61032f610e5c565b6103136004803603604081101561040d57600080fd5b506001600160a01b038135169060200135610e69565b61032f6004803603602081101561043957600080fd5b5035610eb7565b6103136004803603602081101561045657600080fd5b503561107b565b61032f61108f565b6102686004803603602081101561047b57600080fd5b50356001600160a01b031661109b565b61032f61116c565b61032f600480360360208110156104a957600080fd5b8101906020810181356401000000008111156104c457600080fd5b8201836020820111156104d657600080fd5b803590602001918460208302840111640100000000831117156104f857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611178945050505050565b61032f6004803603602081101561054c57600080fd5b50356001600160a01b03166114d7565b6102686114f2565b61032f611594565b6105746115a0565b604080516001600160a01b039092168252519081900360200190f35b6102726115af565b61032f611610565b610313600480360360408110156105b657600080fd5b506001600160a01b03813516906020013561161c565b610313600480360360408110156105e257600080fd5b506001600160a01b038135169060200135611684565b61032f611698565b61032f6116a4565b61032f6004803603602081101561061e57600080fd5b50356116ac565b61032f6118c7565b61032f6004803603604081101561064357600080fd5b506001600160a01b03813581169160200135166118d3565b61032f6118fe565b61032f61190a565b61032f6004803603602081101561068157600080fd5b5035611916565b61032f611ab9565b610268600480360360208110156106a657600080fd5b50356001600160a01b0316611ac1565b61032f611bb9565b6106c6611bc0565b6000546001600160a01b03908116911614610716576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60108054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107c45780601f10610799576101008083540402835291602001916107c4565b820191906000526020600020905b8154815290600101906020018083116107a757829003601f168201915b5050505050905090565b60006107e26107db611bc0565b8484611bc4565b5060015b92915050565b637337a78081565b6715ed49a0f91e000081565b671083bab1f2b7000081565b600181600a811061081957fe5b0154905081565b600f5490565b600063606ba480421161086e576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b601254604080516331a9108f60e11b815260048101859052905160009261010090046001600160a01b031691636352211e916024808301926020929190829003018186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d60208110156108e957600080fd5b50516001600160a01b03161415610943576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099157600080fd5b505afa1580156109a5573d6000803e3d6000fd5b505050506040513d60208110156109bb57600080fd5b505182106109fa5760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b6000637337a7804210610a1157637337a780610a13565b425b90506000610a258263606ba480611cb0565b90506000610a37826301e13380611cf2565b905060008060005b83811015610a90576000600182600a8110610a5657fe5b015490506000610a688261016d611d34565b9050610a748582611d8d565b9450610a84846301e13380611d8d565b93505050600101610a3f565b508084118015610aa05750600a83105b15610af1576000610ab18583611cb0565b90506000600185600a8110610ac257fe5b015490506000610adf62015180610ad98585611d34565b90611cf2565b9050610aeb8582611d8d565b94505050505b610b0482681b1ae4d6e2ef500000611d8d565b955050505050505b919050565b6000610b1e848484611de7565b60125461010090046001600160a01b0316331415610b3b57610bd9565b6013546001600160a01b031615801590610b5f57506013546001600160a01b031633145b15610b6957610bd9565b610bd984610b75611bc0565b610bd48560405180606001604052806028815260200161234c602891396001600160a01b038a166000908152600c6020526040812090610bb3611bc0565b6001600160a01b031681526020810191909152604001600020549190611f44565b611bc4565b5060019392505050565b600063606ba4804211610c2b576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b601254604080516331a9108f60e11b81526000600482018190529151919261010090046001600160a01b031691636352211e91602480820192602092909190829003018186803b158015610c7e57600080fd5b505afa158015610c92573d6000803e3d6000fd5b505050506040513d6020811015610ca857600080fd5b50516001600160a01b03161415610cf05760405162461bcd60e51b81526004018080602001828103825260238152602001806123b56023913960400191505060405180910390fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3e57600080fd5b505afa158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b5051610dbb576040805162461bcd60e51b815260206004820152601c60248201527f4e6f204e4654732068617665206265656e206d696e7465642079657400000000604482015290519081900360640190fd5b6000601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e0b57600080fd5b505afa158015610e1f573d6000803e3d6000fd5b505050506040513d6020811015610e3557600080fd5b50519050610e4d610e466000610826565b8290611d34565b91505090565b60125460ff1690565b681b1ae4d6e2ef50000081565b60006107e2610e76611bc0565b84610bd485600c6000610e87611bc0565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611d8d565b601254604080516331a9108f60e11b815260048101849052905160009283926101009091046001600160a01b031691636352211e91602480820192602092909190829003018186803b158015610f0c57600080fd5b505afa158015610f20573d6000803e3d6000fd5b505050506040513d6020811015610f3657600080fd5b50516001600160a01b03161415610f90576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fde57600080fd5b505afa158015610ff2573d6000803e3d6000fd5b505050506040513d602081101561100857600080fd5b505182106110475760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b6000828152600d60205260408120546110645763606ba480611074565b6000838152600d60205260409020545b9392505050565b60006110873383611fdb565b506001919050565b6706f05b59d3b2000081565b6110a3611bc0565b6000546001600160a01b039081169116146110f3576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b60125461010090046001600160a01b031615611144576040805162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b601280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b674563918244f4000081565b600063606ba48042116111c0576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b6000805b835181101561148557601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121b57600080fd5b505afa15801561122f573d6000803e3d6000fd5b505050506040513d602081101561124557600080fd5b5051845185908390811061125557fe5b6020026020010151106112995760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b600181015b8451811015611322578481815181106112b357fe5b60200260200101518583815181106112c757fe5b6020026020010151141561131a576040805162461bcd60e51b8152602060048201526015602482015274088eae0d8d2c6c2e8ca40e8ded6cadc40d2dcc8caf605b1b604482015290519081900360640190fd5b60010161129e565b50600084828151811061133157fe5b60200260200101519050336001600160a01b0316601260019054906101000a90046001600160a01b03166001600160a01b0316636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561139e57600080fd5b505afa1580156113b2573d6000803e3d6000fd5b505050506040513d60208110156113c857600080fd5b50516001600160a01b031614611425576040805162461bcd60e51b815260206004820152601760248201527f53656e646572206973206e6f7420746865206f776e6572000000000000000000604482015290519081900360640190fd5b6000611430826116ac565b9050801561147b576000828152600d60209081526040808320429055600e90915290205461145e8183611d8d565b6000848152600e60205260409020556114778583611d8d565b9450505b50506001016111c4565b50806114cd576040805162461bcd60e51b8152602060048201526012602482015271139bc81858d8dd5b5d5b185d19590814d19560721b604482015290519081900360640190fd5b6107e633826120d7565b6001600160a01b03166000908152600b602052604090205490565b6114fa611bc0565b6000546001600160a01b0390811691161461154a576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b67340aad21b3b7000081565b6000546001600160a01b031690565b60118054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107c45780601f10610799576101008083540402835291602001916107c4565b67094c51733f83000081565b60006107e2611629611bc0565b84610bd48560405180606001604052806025815260200161242160259139600c6000611653611bc0565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611f44565b60006107e2611691611bc0565b8484611de7565b6726ff201caad9000081565b6301e1338081565b600063606ba48042116116f4576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b601254604080516331a9108f60e11b815260048101859052905160009261010090046001600160a01b031691636352211e916024808301926020929190829003018186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d602081101561176f57600080fd5b50516001600160a01b031614156117c9576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561181757600080fd5b505afa15801561182b573d6000803e3d6000fd5b505050506040513d602081101561184157600080fd5b505182106118805760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b600061188b83610eb7565b9050637337a78081106118a2576000915050610b0c565b60006118bf6118b085611916565b6118b986610826565b90611cb0565b949350505050565b671d4839d21c13000081565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b6704fefa17b724000081565b670c59ea48da19000081565b601254604080516331a9108f60e11b815260048101849052905160009283926101009091046001600160a01b031691636352211e91602480820192602092909190829003018186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d602081101561199557600080fd5b50516001600160a01b031614156119ef576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3d57600080fd5b505afa158015611a51573d6000803e3d6000fd5b505050506040513d6020811015611a6757600080fd5b50518210611aa65760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b506000908152600e602052604090205490565b63606ba48081565b611ac9611bc0565b6000546001600160a01b03908116911614611b19576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b6001600160a01b038116611b5e5760405162461bcd60e51b815260040180806020018281038252602681526020018061229d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6201518081565b3390565b6001600160a01b038316611c095760405162461bcd60e51b81526004018080602001828103825260248152602001806123fd6024913960400191505060405180910390fd5b6001600160a01b038216611c4e5760405162461bcd60e51b81526004018080602001828103825260228152602001806122c36022913960400191505060405180910390fd5b6001600160a01b038084166000818152600c6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061107483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f44565b600061107483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121c9565b600082611d43575060006107e6565b82820282848281611d5057fe5b04146110745760405162461bcd60e51b815260040180806020018281038252602181526020018061232b6021913960400191505060405180910390fd5b600082820183811015611074576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316611e2c5760405162461bcd60e51b81526004018080602001828103825260258152602001806123d86025913960400191505060405180910390fd5b6001600160a01b038216611e715760405162461bcd60e51b81526004018080602001828103825260238152602001806122346023913960400191505060405180910390fd5b611e7c83838361222e565b611eb981604051806060016040528060268152602001612305602691396001600160a01b0386166000908152600b60205260409020549190611f44565b6001600160a01b038085166000908152600b60205260408082209390935590841681522054611ee89082611d8d565b6001600160a01b038084166000818152600b602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611fd35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f98578181015183820152602001611f80565b50505050905090810190601f168015611fc55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166120205760405162461bcd60e51b81526004018080602001828103825260218152602001806123946021913960400191505060405180910390fd5b61202c8260008361222e565b61206981604051806060016040528060228152602001612257602291396001600160a01b0385166000908152600b60205260409020549190611f44565b6001600160a01b0383166000908152600b6020526040902055600f5461208f9082611cb0565b600f556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038216612132576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61213e6000838361222e565b600f5461214b9082611d8d565b600f556001600160a01b0382166000908152600b60205260409020546121719082611d8d565b6001600160a01b0383166000818152600b602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600081836122185760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f98578181015183820152602001611f80565b50600083858161222457fe5b0495945050505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654e465420617420696e64657820686173206e6f74206265656e206d696e746564207965744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373456d697373696f6e20686173206e6f742073746172746564207965740000000045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f20616464726573734f776e6572206f66204e46542023302063616e6e6f742062652030206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203c6aeda7007a871a041bde12b065b1c61e1e8cc98b1a4726a66e8328423c9fdc64736f6c63430007000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80636ba4c1381161013b578063c4fa17a4116100b8578063e5acd8491161007c578063e5acd84914610663578063eaab2c3f1461066b578063eec4c0bf14610688578063f2fde38b14610690578063f9cfa06f146106b65761023d565b8063c4fa17a414610600578063c607cde714610608578063c78e1ca214610625578063dd62ed3e1461062d578063e00e79371461065b5761023d565b806395d89b41116100ff57806395d89b41146105905780639900a07f14610598578063a457c2d7146105a0578063a9059cbb146105cc578063a98c21d2146105f85761023d565b80636ba4c1381461049357806370a0823114610536578063715018a61461055c57806383e585aa146105645780638da5cb5b1461056c5761023d565b806323b872dd116101c95780633d3728b51161018d5780633d3728b51461042357806342966c681461044057806344de648f1461045d5780634c11764014610465578063661d906b1461048b5761023d565b806323b872dd146103935780632edbb9d3146103c9578063313ce567146103d1578063367df165146103ef57806339509351146103f75761023d565b8063118f5a1011610210578063118f5a1014610341578063147f8cfa1461034957806317ca9da81461035157806318160ddd1461036e5780631a6f3a04146103765761023d565b806303518a911461024257806306fdde031461026a578063095ea7b3146102e75780630fe3633c14610327575b600080fd5b6102686004803603602081101561025857600080fd5b50356001600160a01b03166106be565b005b610272610738565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ac578181015183820152602001610294565b50505050905090810190601f1680156102d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610313600480360360408110156102fd57600080fd5b506001600160a01b0381351690602001356107ce565b604080519115158252519081900360200190f35b61032f6107ec565b60408051918252519081900360200190f35b61032f6107f4565b61032f610800565b61032f6004803603602081101561036757600080fd5b503561080c565b61032f610820565b61032f6004803603602081101561038c57600080fd5b5035610826565b610313600480360360608110156103a957600080fd5b506001600160a01b03813581169160208101359091169060400135610b11565b61032f610be3565b6103d9610e53565b6040805160ff9092168252519081900360200190f35b61032f610e5c565b6103136004803603604081101561040d57600080fd5b506001600160a01b038135169060200135610e69565b61032f6004803603602081101561043957600080fd5b5035610eb7565b6103136004803603602081101561045657600080fd5b503561107b565b61032f61108f565b6102686004803603602081101561047b57600080fd5b50356001600160a01b031661109b565b61032f61116c565b61032f600480360360208110156104a957600080fd5b8101906020810181356401000000008111156104c457600080fd5b8201836020820111156104d657600080fd5b803590602001918460208302840111640100000000831117156104f857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611178945050505050565b61032f6004803603602081101561054c57600080fd5b50356001600160a01b03166114d7565b6102686114f2565b61032f611594565b6105746115a0565b604080516001600160a01b039092168252519081900360200190f35b6102726115af565b61032f611610565b610313600480360360408110156105b657600080fd5b506001600160a01b03813516906020013561161c565b610313600480360360408110156105e257600080fd5b506001600160a01b038135169060200135611684565b61032f611698565b61032f6116a4565b61032f6004803603602081101561061e57600080fd5b50356116ac565b61032f6118c7565b61032f6004803603604081101561064357600080fd5b506001600160a01b03813581169160200135166118d3565b61032f6118fe565b61032f61190a565b61032f6004803603602081101561068157600080fd5b5035611916565b61032f611ab9565b610268600480360360208110156106a657600080fd5b50356001600160a01b0316611ac1565b61032f611bb9565b6106c6611bc0565b6000546001600160a01b03908116911614610716576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60108054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107c45780601f10610799576101008083540402835291602001916107c4565b820191906000526020600020905b8154815290600101906020018083116107a757829003601f168201915b5050505050905090565b60006107e26107db611bc0565b8484611bc4565b5060015b92915050565b637337a78081565b6715ed49a0f91e000081565b671083bab1f2b7000081565b600181600a811061081957fe5b0154905081565b600f5490565b600063606ba480421161086e576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b601254604080516331a9108f60e11b815260048101859052905160009261010090046001600160a01b031691636352211e916024808301926020929190829003018186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d60208110156108e957600080fd5b50516001600160a01b03161415610943576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099157600080fd5b505afa1580156109a5573d6000803e3d6000fd5b505050506040513d60208110156109bb57600080fd5b505182106109fa5760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b6000637337a7804210610a1157637337a780610a13565b425b90506000610a258263606ba480611cb0565b90506000610a37826301e13380611cf2565b905060008060005b83811015610a90576000600182600a8110610a5657fe5b015490506000610a688261016d611d34565b9050610a748582611d8d565b9450610a84846301e13380611d8d565b93505050600101610a3f565b508084118015610aa05750600a83105b15610af1576000610ab18583611cb0565b90506000600185600a8110610ac257fe5b015490506000610adf62015180610ad98585611d34565b90611cf2565b9050610aeb8582611d8d565b94505050505b610b0482681b1ae4d6e2ef500000611d8d565b955050505050505b919050565b6000610b1e848484611de7565b60125461010090046001600160a01b0316331415610b3b57610bd9565b6013546001600160a01b031615801590610b5f57506013546001600160a01b031633145b15610b6957610bd9565b610bd984610b75611bc0565b610bd48560405180606001604052806028815260200161234c602891396001600160a01b038a166000908152600c6020526040812090610bb3611bc0565b6001600160a01b031681526020810191909152604001600020549190611f44565b611bc4565b5060019392505050565b600063606ba4804211610c2b576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b601254604080516331a9108f60e11b81526000600482018190529151919261010090046001600160a01b031691636352211e91602480820192602092909190829003018186803b158015610c7e57600080fd5b505afa158015610c92573d6000803e3d6000fd5b505050506040513d6020811015610ca857600080fd5b50516001600160a01b03161415610cf05760405162461bcd60e51b81526004018080602001828103825260238152602001806123b56023913960400191505060405180910390fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3e57600080fd5b505afa158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b5051610dbb576040805162461bcd60e51b815260206004820152601c60248201527f4e6f204e4654732068617665206265656e206d696e7465642079657400000000604482015290519081900360640190fd5b6000601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e0b57600080fd5b505afa158015610e1f573d6000803e3d6000fd5b505050506040513d6020811015610e3557600080fd5b50519050610e4d610e466000610826565b8290611d34565b91505090565b60125460ff1690565b681b1ae4d6e2ef50000081565b60006107e2610e76611bc0565b84610bd485600c6000610e87611bc0565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611d8d565b601254604080516331a9108f60e11b815260048101849052905160009283926101009091046001600160a01b031691636352211e91602480820192602092909190829003018186803b158015610f0c57600080fd5b505afa158015610f20573d6000803e3d6000fd5b505050506040513d6020811015610f3657600080fd5b50516001600160a01b03161415610f90576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fde57600080fd5b505afa158015610ff2573d6000803e3d6000fd5b505050506040513d602081101561100857600080fd5b505182106110475760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b6000828152600d60205260408120546110645763606ba480611074565b6000838152600d60205260409020545b9392505050565b60006110873383611fdb565b506001919050565b6706f05b59d3b2000081565b6110a3611bc0565b6000546001600160a01b039081169116146110f3576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b60125461010090046001600160a01b031615611144576040805162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b601280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b674563918244f4000081565b600063606ba48042116111c0576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b6000805b835181101561148557601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561121b57600080fd5b505afa15801561122f573d6000803e3d6000fd5b505050506040513d602081101561124557600080fd5b5051845185908390811061125557fe5b6020026020010151106112995760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b600181015b8451811015611322578481815181106112b357fe5b60200260200101518583815181106112c757fe5b6020026020010151141561131a576040805162461bcd60e51b8152602060048201526015602482015274088eae0d8d2c6c2e8ca40e8ded6cadc40d2dcc8caf605b1b604482015290519081900360640190fd5b60010161129e565b50600084828151811061133157fe5b60200260200101519050336001600160a01b0316601260019054906101000a90046001600160a01b03166001600160a01b0316636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561139e57600080fd5b505afa1580156113b2573d6000803e3d6000fd5b505050506040513d60208110156113c857600080fd5b50516001600160a01b031614611425576040805162461bcd60e51b815260206004820152601760248201527f53656e646572206973206e6f7420746865206f776e6572000000000000000000604482015290519081900360640190fd5b6000611430826116ac565b9050801561147b576000828152600d60209081526040808320429055600e90915290205461145e8183611d8d565b6000848152600e60205260409020556114778583611d8d565b9450505b50506001016111c4565b50806114cd576040805162461bcd60e51b8152602060048201526012602482015271139bc81858d8dd5b5d5b185d19590814d19560721b604482015290519081900360640190fd5b6107e633826120d7565b6001600160a01b03166000908152600b602052604090205490565b6114fa611bc0565b6000546001600160a01b0390811691161461154a576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b67340aad21b3b7000081565b6000546001600160a01b031690565b60118054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107c45780601f10610799576101008083540402835291602001916107c4565b67094c51733f83000081565b60006107e2611629611bc0565b84610bd48560405180606001604052806025815260200161242160259139600c6000611653611bc0565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611f44565b60006107e2611691611bc0565b8484611de7565b6726ff201caad9000081565b6301e1338081565b600063606ba48042116116f4576040805162461bcd60e51b815260206004820152601c60248201526000805160206122e5833981519152604482015290519081900360640190fd5b601254604080516331a9108f60e11b815260048101859052905160009261010090046001600160a01b031691636352211e916024808301926020929190829003018186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d602081101561176f57600080fd5b50516001600160a01b031614156117c9576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561181757600080fd5b505afa15801561182b573d6000803e3d6000fd5b505050506040513d602081101561184157600080fd5b505182106118805760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b600061188b83610eb7565b9050637337a78081106118a2576000915050610b0c565b60006118bf6118b085611916565b6118b986610826565b90611cb0565b949350505050565b671d4839d21c13000081565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b6704fefa17b724000081565b670c59ea48da19000081565b601254604080516331a9108f60e11b815260048101849052905160009283926101009091046001600160a01b031691636352211e91602480820192602092909190829003018186803b15801561196b57600080fd5b505afa15801561197f573d6000803e3d6000fd5b505050506040513d602081101561199557600080fd5b50516001600160a01b031614156119ef576040805162461bcd60e51b81526020600482015260196024820152784f776e65722063616e6e6f742062652030206164647265737360381b604482015290519081900360640190fd5b601260019054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3d57600080fd5b505afa158015611a51573d6000803e3d6000fd5b505050506040513d6020811015611a6757600080fd5b50518210611aa65760405162461bcd60e51b81526004018080602001828103825260248152602001806122796024913960400191505060405180910390fd5b506000908152600e602052604090205490565b63606ba48081565b611ac9611bc0565b6000546001600160a01b03908116911614611b19576040805162461bcd60e51b81526020600482018190526024820152600080516020612374833981519152604482015290519081900360640190fd5b6001600160a01b038116611b5e5760405162461bcd60e51b815260040180806020018281038252602681526020018061229d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6201518081565b3390565b6001600160a01b038316611c095760405162461bcd60e51b81526004018080602001828103825260248152602001806123fd6024913960400191505060405180910390fd5b6001600160a01b038216611c4e5760405162461bcd60e51b81526004018080602001828103825260228152602001806122c36022913960400191505060405180910390fd5b6001600160a01b038084166000818152600c6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061107483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f44565b600061107483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121c9565b600082611d43575060006107e6565b82820282848281611d5057fe5b04146110745760405162461bcd60e51b815260040180806020018281038252602181526020018061232b6021913960400191505060405180910390fd5b600082820183811015611074576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038316611e2c5760405162461bcd60e51b81526004018080602001828103825260258152602001806123d86025913960400191505060405180910390fd5b6001600160a01b038216611e715760405162461bcd60e51b81526004018080602001828103825260238152602001806122346023913960400191505060405180910390fd5b611e7c83838361222e565b611eb981604051806060016040528060268152602001612305602691396001600160a01b0386166000908152600b60205260409020549190611f44565b6001600160a01b038085166000908152600b60205260408082209390935590841681522054611ee89082611d8d565b6001600160a01b038084166000818152600b602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611fd35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f98578181015183820152602001611f80565b50505050905090810190601f168015611fc55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0382166120205760405162461bcd60e51b81526004018080602001828103825260218152602001806123946021913960400191505060405180910390fd5b61202c8260008361222e565b61206981604051806060016040528060228152602001612257602291396001600160a01b0385166000908152600b60205260409020549190611f44565b6001600160a01b0383166000908152600b6020526040902055600f5461208f9082611cb0565b600f556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038216612132576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61213e6000838361222e565b600f5461214b9082611d8d565b600f556001600160a01b0382166000908152600b60205260409020546121719082611d8d565b6001600160a01b0383166000818152600b602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600081836122185760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f98578181015183820152602001611f80565b50600083858161222457fe5b0495945050505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654e465420617420696e64657820686173206e6f74206265656e206d696e746564207965744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373456d697373696f6e20686173206e6f742073746172746564207965740000000045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f20616464726573734f776e6572206f66204e46542023302063616e6e6f742062652030206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203c6aeda7007a871a041bde12b065b1c61e1e8cc98b1a4726a66e8328423c9fdc64736f6c63430007000033

Deployed Bytecode Sourcemap

307:18948:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:115;;;;;;;;;;;;;;;;-1:-1:-1;9442:115:8;-1:-1:-1;;;;;9442:115:8;;:::i;:::-;;3364:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11741:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11741:169:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;730:80;;;:::i;:::-;;;;;;;;;;;;;;;;1204:67;;;:::i;1278:::-;;;:::i;1654:739::-;;;;;;;;;;;;;;;;-1:-1:-1;1654:739:8;;:::i;4439:100::-;;;:::i;6765:1771::-;;;;;;;;;;;;;;;;-1:-1:-1;6765:1771:8;;:::i;12392:802::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12392:802:8;;;;;;;;;;;;;;;;;:::i;5381:489::-;;;:::i;4291:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;540:60;;;:::i;13603:218::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13603:218:8;;;;;;;;:::i;4834:440::-;;;;;;;;;;;;;;;;-1:-1:-1;4834:440:8;;:::i;13981:147::-;;;;;;;;;;;;;;;;-1:-1:-1;13981:147:8;;:::i;1500:67::-;;;:::i;9169:173::-;;;;;;;;;;;;;;;;-1:-1:-1;9169:173:8;-1:-1:-1;;;;;9169:173:8;;:::i;908:67::-;;;:::i;9675:1317::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9675:1317:8;;-1:-1:-1;9675:1317:8;;-1:-1:-1;;;;;9675:1317:8:i;4602:119::-;;;;;;;;;;;;;;;;-1:-1:-1;4602:119:8;-1:-1:-1;;;;;4602:119:8;;:::i;1188:148:7:-;;;:::i;982:67:8:-;;;:::i;546:79:7:-;;;:::i;:::-;;;;-1:-1:-1;;;;;546:79:7;;;;;;;;;;;;;;3566:87:8;;;:::i;1426:67::-;;;:::i;14642:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14642:269:8;;;;;;;;:::i;11205:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11205:175:8;;;;;;;;:::i;1056:67::-;;;:::i;461:66::-;;;:::i;5968:690::-;;;;;;;;;;;;;;;;-1:-1:-1;5968:690:8;;:::i;1130:67::-;;;:::i;11443:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11443:151:8;;;;;;;;;;:::i;1574:67::-;;;:::i;1352:::-;;;:::i;8643:447::-;;;;;;;;;;;;;;;;-1:-1:-1;8643:447:8;;:::i;634:51::-;;;:::i;1491:244:7:-;;;;;;;;;;;;;;;;-1:-1:-1;1491:244:7;-1:-1:-1;;;;;1491:244:7;;:::i;406:48:8:-;;;:::i;9442:115::-;768:12:7;:10;:12::i;:::-;758:6;;-1:-1:-1;;;;;758:6:7;;;:22;;;750:67;;;;;-1:-1:-1;;;750:67:7;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;750:67:7;;;;;;;;;;;;;;;9519:14:8::1;:30:::0;;-1:-1:-1;;;;;;9519:30:8::1;-1:-1:-1::0;;;;;9519:30:8;;;::::1;::::0;;;::::1;::::0;;9442:115::o;3364:83::-;3434:5;3427:12;;;;;;;;-1:-1:-1;;3427:12:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3401:13;;3427:12;;3434:5;;3427:12;;3434:5;3427:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3364:83;:::o;11741:169::-;11824:4;11841:39;11850:12;:10;:12::i;:::-;11864:7;11873:6;11841:8;:39::i;:::-;-1:-1:-1;11898:4:8;11741:169;;;;;:::o;730:80::-;769:41;730:80;:::o;1204:67::-;1254:17;1204:67;:::o;1278:::-;1328:17;1278:67;:::o;1654:739::-;;;;;;;;;;;;;-1:-1:-1;1654:739:8;:::o;4439:100::-;4519:12;;4439:100;:::o;6765:1771::-;6841:7;675:10;6869:15;:32;6861:73;;;;;-1:-1:-1;;;6861:73:8;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6861:73:8;;;;;;;;;;;;;;;6960:13;;6953:41;;;-1:-1:-1;;;6953:41:8;;;;;;;;;;7006:1;;6960:13;;;-1:-1:-1;;;;;6960:13:8;;6953:29;;:41;;;;;;;;;;;;;;6960:13;6953:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6953:41:8;-1:-1:-1;;;;;6953:55:8;;;6945:93;;;;;-1:-1:-1;;;6945:93:8;;;;;;;;;;;;-1:-1:-1;;;6945:93:8;;;;;;;;;;;;;;;7077:13;;;;;;;;;-1:-1:-1;;;;;7077:13:8;-1:-1:-1;;;;;7070:33:8;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7070:35:8;7057:48;;7049:97;;;;-1:-1:-1;;;7049:97:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7167:15;769:41;7185:15;:30;:63;;769:41;7185:63;;;7218:15;7185:63;7167:81;-1:-1:-1;7259:19:8;7281:27;7167:81;675:10;7281:11;:27::i;:::-;7259:49;-1:-1:-1;7319:20:8;7342:34;7259:49;505:22;7342:15;:34::i;:::-;7319:57;;7387:30;7432:24;7529:9;7525:362;7551:12;7544:4;:19;7525:362;;;7588:29;7620:22;7643:4;7620:28;;;;;;;;;;-1:-1:-1;7663:23:8;7689:30;7620:28;7715:3;7689:25;:30::i;:::-;7663:56;-1:-1:-1;7759:43:8;:22;7663:56;7759:26;:43::i;:::-;7734:68;-1:-1:-1;7836:39:8;:16;505:22;7836:20;:39::i;:::-;7817:58;-1:-1:-1;;;7565:6:8;;7525:362;;;;7966:16;7952:11;:30;:51;;;;;8001:2;7986:12;:17;7952:51;7949:415;;;8020:21;8044:33;:11;8060:16;8044:15;:33::i;:::-;8020:57;;8092:27;8122:22;8145:12;8122:36;;;;;;;;;;-1:-1:-1;8173:28:8;8204:60;449:5;8204:38;:13;8122:36;8204:17;:38::i;:::-;:42;;:60::i;:::-;8173:91;-1:-1:-1;8304:48:8;:22;8173:91;8304:26;:48::i;:::-;8279:73;;7949:415;;;;8433:45;:22;584:16;8433:26;:45::i;:::-;8408:70;-1:-1:-1;;;;;;6765:1771:8;;;;:::o;12392:802::-;12498:4;12515:36;12525:6;12533:9;12544:6;12515:9;:36::i;:::-;12716:13;;;;;-1:-1:-1;;;;;12716:13:8;12702:10;:27;12698:467;;;;;;12829:14;;-1:-1:-1;;;;;12829:14:8;:28;;;;:60;;-1:-1:-1;12875:14:8;;-1:-1:-1;;;;;12875:14:8;12861:10;:28;12829:60;12826:339;;;;;;13032:121;13041:6;13049:12;:10;:12::i;:::-;13063:89;13101:6;13063:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13063:19:8;;;;;;:11;:19;;;;;;13083:12;:10;:12::i;:::-;-1:-1:-1;;;;;13063:33:8;;;;;;;;;;;;-1:-1:-1;13063:33:8;;;:89;:37;:89::i;:::-;13032:8;:121::i;:::-;-1:-1:-1;13182:4:8;12392:802;;;;;:::o;5381:489::-;5445:7;675:10;5473:15;:32;5465:73;;;;;-1:-1:-1;;;5465:73:8;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5465:73:8;;;;;;;;;;;;;;;5564:13;;5557:32;;;-1:-1:-1;;;5557:32:8;;5601:1;5557:32;;;;;;;;5601:1;;5564:13;;;-1:-1:-1;;;;;5564:13:8;;5557:29;;:32;;;;;;;;;;;;;;;5564:13;5557:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5557:32:8;-1:-1:-1;;;;;5557:46:8;;;5549:94;;;;-1:-1:-1;;;5549:94:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5673:13;;;;;;;;;-1:-1:-1;;;;;5673:13:8;-1:-1:-1;;;;;5666:33:8;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5666:35:8;5654:80;;;;;-1:-1:-1;;;5654:80:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;5755:17;5782:13;;;;;;;;;-1:-1:-1;;;;;5782:13:8;-1:-1:-1;;;;;5775:33:8;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5775:35:8;;-1:-1:-1;5828:34:8;5842:19;5859:1;5842:16;:19::i;:::-;5828:9;;:13;:34::i;:::-;5821:41;;;5381:489;:::o;4291:83::-;4357:9;;;;4291:83;:::o;540:60::-;584:16;540:60;:::o;13603:218::-;13691:4;13708:83;13717:12;:10;:12::i;:::-;13731:7;13740:50;13779:10;13740:11;:25;13752:12;:10;:12::i;:::-;-1:-1:-1;;;;;13740:25:8;;;;;;;;;;;;;;;;;-1:-1:-1;13740:25:8;;;:34;;;;;;;;;;;:38;:50::i;4834:440::-;4929:13;;4922:41;;;-1:-1:-1;;;4922:41:8;;;;;;;;;;4894:7;;;;4929:13;;;;-1:-1:-1;;;;;4929:13:8;;4922:29;;:41;;;;;;;;;;;;;;;4929:13;4922:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4922:41:8;-1:-1:-1;;;;;4922:55:8;;;4914:93;;;;;-1:-1:-1;;;4914:93:8;;;;;;;;;;;;-1:-1:-1;;;4914:93:8;;;;;;;;;;;;;;;5046:13;;;;;;;;;-1:-1:-1;;;;;5046:13:8;-1:-1:-1;;;;;5039:33:8;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5039:35:8;5026:48;;5018:97;;;;-1:-1:-1;;;5018:97:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5128:19;5158:22;;;:10;:22;;;;;;5150:87;;675:10;5150:87;;;5197:22;;;;:10;:22;;;;;;5150:87;5128:109;4834:440;-1:-1:-1;;;4834:440:8:o;13981:147::-;14050:4;14067:31;14073:10;14085:12;14067:5;:31::i;:::-;-1:-1:-1;14116:4:8;13981:147;;;:::o;1500:67::-;1550:17;1500:67;:::o;9169:173::-;768:12:7;:10;:12::i;:::-;758:6;;-1:-1:-1;;;;;758:6:7;;;:22;;;750:67;;;;;-1:-1:-1;;;750:67:7;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;750:67:7;;;;;;;;;;;;;;;9252:13:8::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;9252:13:8::1;:27:::0;9244:51:::1;;;::::0;;-1:-1:-1;;;9244:51:8;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9244:51:8;;;;;;;;;;;;;::::1;;9306:13;:28:::0;;-1:-1:-1;;;;;9306:28:8;;::::1;;;-1:-1:-1::0;;;;;;9306:28:8;;::::1;::::0;;;::::1;::::0;;9169:173::o;908:67::-;958:17;908:67;:::o;9675:1317::-;9737:7;675:10;9765:15;:32;9757:73;;;;;-1:-1:-1;;;9757:73:8;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9757:73:8;;;;;;;;;;;;;;;9843:21;9884:6;9879:969;9900:12;:19;9896:1;:23;9879:969;;;10024:13;;;;;;;;;-1:-1:-1;;;;;10024:13:8;-1:-1:-1;;;;;10017:33:8;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10017:35:8;9999:15;;:12;;10012:1;;9999:15;;;;;;;;;;;;:53;9991:102;;;;-1:-1:-1;;;9991:102:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10170:1;10166:5;;10152:154;10177:12;:19;10173:1;:23;10152:154;;;10249:12;10262:1;10249:15;;;;;;;;;;;;;;10230:12;10243:1;10230:15;;;;;;;;;;;;;;:34;;10222:68;;;;;-1:-1:-1;;;10222:68:8;;;;;;;;;;;;-1:-1:-1;;;10222:68:8;;;;;;;;;;;;;;;10198:3;;10152:154;;;;10322:15;10340:12;10353:1;10340:15;;;;;;;;;;;;;;10322:33;;10423:10;-1:-1:-1;;;;;10378:55:8;10385:13;;;;;;;;;-1:-1:-1;;;;;10385:13:8;-1:-1:-1;;;;;10378:29:8;;10408:10;10378:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10378:41:8;-1:-1:-1;;;;;10378:55:8;;10370:91;;;;;-1:-1:-1;;;10370:91:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;10478:16;10497:23;10509:10;10497:11;:23::i;:::-;10478:42;-1:-1:-1;10539:13:8;;10535:302;;10573:22;;;;:10;:22;;;;;;;;10598:15;10573:40;;10657:14;:26;;;;;;10731:28;10657:26;10750:8;10731:18;:28::i;:::-;10702:26;;;;:14;:26;;;;;:57;10794:27;:13;10812:8;10794:17;:27::i;:::-;10778:43;;10535:302;;-1:-1:-1;;9921:3:8;;9879:969;;;-1:-1:-1;10868:18:8;10860:49;;;;;-1:-1:-1;;;10860:49:8;;;;;;;;;;;;-1:-1:-1;;;10860:49:8;;;;;;;;;;;;;;;10920:32;10926:10;10938:13;10920:5;:32::i;4602:119::-;-1:-1:-1;;;;;4695:18:8;4668:7;4695:18;;;:9;:18;;;;;;;4602:119::o;1188:148:7:-;768:12;:10;:12::i;:::-;758:6;;-1:-1:-1;;;;;758:6:7;;;:22;;;750:67;;;;;-1:-1:-1;;;750:67:7;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;750:67:7;;;;;;;;;;;;;;;1295:1:::1;1279:6:::0;;1258:40:::1;::::0;-1:-1:-1;;;;;1279:6:7;;::::1;::::0;1258:40:::1;::::0;1295:1;;1258:40:::1;1326:1;1309:19:::0;;-1:-1:-1;;;;;;1309:19:7::1;::::0;;1188:148::o;982:67:8:-;1032:17;982:67;:::o;546:79:7:-;584:7;611:6;-1:-1:-1;;;;;611:6:7;546:79;:::o;3566:87:8:-;3638:7;3631:14;;;;;;;;-1:-1:-1;;3631:14:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3605:13;;3631:14;;3638:7;;3631:14;;3638:7;3631:14;;;;;;;;;;;;;;;;;;;;;;;;1426:67;1476:17;1426:67;:::o;14642:269::-;14735:4;14752:129;14761:12;:10;:12::i;:::-;14775:7;14784:96;14823:15;14784:96;;;;;;;;;;;;;;;;;:11;:25;14796:12;:10;:12::i;:::-;-1:-1:-1;;;;;14784:25:8;;;;;;;;;;;;;;;;;-1:-1:-1;14784:25:8;;;:34;;;;;;;;;;;:96;:38;:96::i;11205:175::-;11291:4;11308:42;11318:12;:10;:12::i;:::-;11332:9;11343:6;11308:9;:42::i;1056:67::-;1106:17;1056:67;:::o;461:66::-;505:22;461:66;:::o;5968:690::-;6039:7;675:10;6067:15;:32;6059:73;;;;;-1:-1:-1;;;6059:73:8;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6059:73:8;;;;;;;;;;;;;;;6158:13;;6151:41;;;-1:-1:-1;;;6151:41:8;;;;;;;;;;6204:1;;6158:13;;;-1:-1:-1;;;;;6158:13:8;;6151:29;;:41;;;;;;;;;;;;;;6158:13;6151:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6151:41:8;-1:-1:-1;;;;;6151:55:8;;;6143:93;;;;;-1:-1:-1;;;6143:93:8;;;;;;;;;;;;-1:-1:-1;;;6143:93:8;;;;;;;;;;;;;;;6275:13;;;;;;;;;-1:-1:-1;;;;;6275:13:8;-1:-1:-1;;;;;6268:33:8;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6268:35:8;6255:48;;6247:97;;;;-1:-1:-1;;;6247:97:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6357:19;6379:21;6389:10;6379:9;:21::i;:::-;6357:43;-1:-1:-1;769:41:8;6485:27;;6481:41;;6521:1;6514:8;;;;;6481:41;6535:22;6560:58;6593:24;6606:10;6593:12;:24::i;:::-;6560:28;6577:10;6560:16;:28::i;:::-;:32;;:58::i;:::-;6535:83;5968:690;-1:-1:-1;;;;5968:690:8:o;1130:67::-;1180:17;1130:67;:::o;11443:151::-;-1:-1:-1;;;;;11559:18:8;;;11532:7;11559:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11443:151::o;1574:67::-;1624:17;1574:67;:::o;1352:::-;1402:17;1352:67;:::o;8643:447::-;8750:13;;8743:41;;;-1:-1:-1;;;8743:41:8;;;;;;;;;;8715:7;;;;8750:13;;;;-1:-1:-1;;;;;8750:13:8;;8743:29;;:41;;;;;;;;;;;;;;;8750:13;8743:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8743:41:8;-1:-1:-1;;;;;8743:55:8;;;8735:93;;;;;-1:-1:-1;;;8735:93:8;;;;;;;;;;;;-1:-1:-1;;;8735:93:8;;;;;;;;;;;;;;;8867:13;;;;;;;;;-1:-1:-1;;;;;8867:13:8;-1:-1:-1;;;;;8860:33:8;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8860:35:8;8847:48;;8839:97;;;;-1:-1:-1;;;8839:97:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8957:15:8;8983:26;;;:14;:26;;9026;;;;;8643:447::o;634:51::-;675:10;634:51;:::o;1491:244:7:-;768:12;:10;:12::i;:::-;758:6;;-1:-1:-1;;;;;758:6:7;;;:22;;;750:67;;;;;-1:-1:-1;;;750:67:7;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;750:67:7;;;;;;;;;;;;;;;-1:-1:-1;;;;;1580:22:7;::::1;1572:73;;;;-1:-1:-1::0;;;1572:73:7::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1682:6;::::0;;1661:38:::1;::::0;-1:-1:-1;;;;;1661:38:7;;::::1;::::0;1682:6;::::1;::::0;1661:38:::1;::::0;::::1;1710:6;:17:::0;;-1:-1:-1;;;;;;1710:17:7::1;-1:-1:-1::0;;;;;1710:17:7;;;::::1;::::0;;;::::1;::::0;;1491:244::o;406:48:8:-;449:5;406:48;:::o;543:106:0:-;631:10;543:106;:::o;17789:346:8:-;-1:-1:-1;;;;;17891:19:8;;17883:68;;;;-1:-1:-1;;;17883:68:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17970:21:8;;17962:68;;;;-1:-1:-1;;;17962:68:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18043:18:8;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18095:32;;;;;;;;;;;;;;;;;17789:346;;;:::o;1331:136:9:-;1389:7;1416:43;1420:1;1423;1416:43;;;;;;;;;;;;;;;;;:3;:43::i;3168:132::-;3226:7;3253:39;3257:1;3260;3253:39;;;;;;;;;;;;;;;;;:3;:39::i;2221:471::-;2279:7;2524:6;2520:47;;-1:-1:-1;2554:1:9;2547:8;;2520:47;2591:5;;;2595:1;2591;:5;:1;2615:5;;;;;:10;2607:56;;;;-1:-1:-1;;;2607:56:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;867:181;925:7;957:5;;;981:6;;;;973:46;;;;;-1:-1:-1;;;973:46:9;;;;;;;;;;;;;;;;;;;;;;;;;;;15401:539:8;-1:-1:-1;;;;;15507:20:8;;15499:70;;;;-1:-1:-1;;;15499:70:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15588:23:8;;15580:71;;;;-1:-1:-1;;;15580:71:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15664:47;15685:6;15693:9;15704:6;15664:20;:47::i;:::-;15744:71;15766:6;15744:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15744:17:8;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;15724:17:8;;;;;;;:9;:17;;;;;;:91;;;;15849:20;;;;;;;:32;;15874:6;15849:24;:32::i;:::-;-1:-1:-1;;;;;15826:20:8;;;;;;;:9;:20;;;;;;;;;:55;;;;15897:35;;;;;;;15826:20;;15897:35;;;;;;;;;;;;;15401:539;;;:::o;1770:192:9:-;1856:7;1892:12;1884:6;;;;1876:29;;;;-1:-1:-1;;;1876:29:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1928:5:9;;;1770:192::o;16933:418:8:-;-1:-1:-1;;;;;17017:21:8;;17009:67;;;;-1:-1:-1;;;17009:67:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:49;17110:7;17127:1;17131:6;17089:20;:49::i;:::-;17172:68;17195:6;17172:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17172:18:8;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;17151:18:8;;;;;;:9;:18;;;;;:89;17266:12;;:24;;17283:6;17266:16;:24::i;:::-;17251:12;:39;17306:37;;;;;;;;17332:1;;-1:-1:-1;;;;;17306:37:8;;;;;;;;;;;;16933:418;;:::o;16222:378::-;-1:-1:-1;;;;;16306:21:8;;16298:65;;;;;-1:-1:-1;;;16298:65:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;16376:49;16405:1;16409:7;16418:6;16376:20;:49::i;:::-;16453:12;;:24;;16470:6;16453:16;:24::i;:::-;16438:12;:39;-1:-1:-1;;;;;16509:18:8;;;;;;:9;:18;;;;;;:30;;16532:6;16509:22;:30::i;:::-;-1:-1:-1;;;;;16488:18:8;;;;;;:9;:18;;;;;;;;:51;;;;16555:37;;;;;;;16488:18;;;;16555:37;;;;;;;;;;16222:378;;:::o;3796:278:9:-;3882:7;3917:12;3910:5;3902:28;;;;-1:-1:-1;;;3902:28:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3941:9;3957:1;3953;:5;;;;;;;3796:278;-1:-1:-1;;;;;3796:278:9:o;19160:92:8:-;;;;:::o

Swarm Source

ipfs://3c6aeda7007a871a041bde12b065b1c61e1e8cc98b1a4726a66e8328423c9fdc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.