ETH Price: $2,992.60 (+3.81%)
Gas: 4 Gwei

Token

Pin Galaxy Stardust (PINGALSD)
 

Overview

Max Total Supply

6,139,115.258384 PINGALSD

Holders

142

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
17,653.746968 PINGALSD

Value
$0.00
0x5f87d6f2b82307f323e3e228d550dfd7a24e418c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PinGalaxyStardust

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-02
*/

// SPDX-License-Identifier: MIT LICENSE

// Pin Galaxy Stardust is an ERC20 token rewarded to Pin Planets holders and Pin Galaxy Heroes holders


// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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:
     *
     * - `account` 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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}






// Pin Galaxy Stardust :D
// File: contracts/pin-galaxy-stardust.sol

pragma solidity ^0.8.7;



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

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

contract PinGalaxyStardust is ERC20, Ownable {
    uint256 public TIME_YIELD_START = 1661080459; // Sun Aug 21 2022 11:14:19 GMT+0000 (Pin Planets Deployment)
    uint256 public TIME_YIELD_END = TIME_YIELD_START + 4 * 365 days; // 4 years after Pin Planets Deployment
    uint256 public REWARD_PER_SECOND = 48620000000000;
    uint256 public REWARD_MULTIPLIER_PINPLANETS = 100;
    uint256 public REWARD_MULTIPLIER_PINGALHERO = 1;

    mapping(uint256 => uint256) private lastTimePinPlanetsClaimedMap; // tokenId => timestamp
    mapping(uint256 => uint256) private lastTimePinGalHeroClaimedMap; // tokenId => timestamp
    address private PINPLANETS_ADDRESS =
        0xa808F088391839728897b83849323cf823Ab73AF;
    address private PINGALHERO_ADDRESS; // must be set after pin galaxy heroes is deployed
    address[] private ALLOWED_TO_BURN_LIST;

    constructor() ERC20("Pin Galaxy Stardust", "PINGALSD") {
        uint256 timeSincePinPlanetsDeployed = block.timestamp - TIME_YIELD_START;
        uint256 reward = timeSincePinPlanetsDeployed * REWARD_PER_SECOND * REWARD_MULTIPLIER_PINPLANETS;
        for (uint256 i = 1; i <= 250; i++) {
            address ownerOfToken = IERC721(PINPLANETS_ADDRESS).ownerOf(i);
            _mint(ownerOfToken, reward);
            lastTimePinPlanetsClaimedMap[i] = block.timestamp;
        }
    }

    function pinPlanetsTokenIdsOf(address owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenIdsLength = IERC721(PINPLANETS_ADDRESS).balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenIdsLength);
        uint256 tokenIdsIndex = 0;

        for (uint256 i = 1; tokenIdsIndex < tokenIdsLength; i++) {
            if (IERC721(PINPLANETS_ADDRESS).ownerOf(i) == owner) {
                tokenIds[tokenIdsIndex++] = i;
            }
        }

        return tokenIds;
    }

    function calculatePinPlanetsReward(uint256[] memory tokenIds)
        external
        view
        returns (uint256 reward)
    {
        uint256 _reward = 0;
        for (uint256 i = 0; i < tokenIds.length; i++) {
            _reward += calculateReward(
                lastTimePinPlanetsClaimedMap[tokenIds[i]],
                REWARD_MULTIPLIER_PINPLANETS
            );
        }

        return _reward;
    }

    function claimPinPlanetsReward(uint256[] memory tokenIds) external {
        require(tokenIds.length > 0, "You must send a list of token IDs");

        uint256 reward = 0;
        address ownerOfTokens = IERC721(PINPLANETS_ADDRESS).ownerOf(tokenIds[0]);

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(
                ownerOfTokens == IERC721(PINPLANETS_ADDRESS).ownerOf(tokenIds[i]),
                "All planets must belong to the same address."
            );

            reward += calculateReward(
                lastTimePinPlanetsClaimedMap[tokenIds[i]],
                REWARD_MULTIPLIER_PINPLANETS
            );

            lastTimePinPlanetsClaimedMap[tokenIds[i]] = block.timestamp;
        }

        require(reward > 0, "Reward is 0");

        _mint(ownerOfTokens, reward);
    }

    function calculatePinGalaxyHeroesReward(uint256[] memory tokenIds)
        external
        view
        returns (uint256 reward)
    {
        uint256 _reward = 0;
        for (uint256 i = 0; i < tokenIds.length; i++) {
            _reward += calculateReward(
                lastTimePinGalHeroClaimedMap[tokenIds[i]],
                REWARD_MULTIPLIER_PINGALHERO
            );
        }

        return _reward;
    }

    function claimPinGalaxyHeroesReward(uint256[] memory tokenIds) external {
        require(tokenIds.length > 0, "You must send a list of token IDs");

        uint256 reward = 0;
        address ownerOfTokens = IERC721(PINGALHERO_ADDRESS).ownerOf(tokenIds[0]);

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(
                ownerOfTokens == IERC721(PINGALHERO_ADDRESS).ownerOf(tokenIds[i]),
               "All heroes must belong to the same address."
            );

            reward += calculateReward(
                lastTimePinGalHeroClaimedMap[tokenIds[i]],
                REWARD_MULTIPLIER_PINGALHERO
            );

            lastTimePinGalHeroClaimedMap[tokenIds[i]] = block.timestamp;
        }

        require(reward > 0, "Reward is 0");

        _mint(ownerOfTokens, reward);
    }

    function burnFrom(address account, uint256 amount) external {
        bool isAllowedToBurn = false;
        for(uint256 i = 0; i < ALLOWED_TO_BURN_LIST.length; i++) {
            if (msg.sender == ALLOWED_TO_BURN_LIST[i]) {
                isAllowedToBurn = true;
                break;
            }
        }
        require(
            isAllowedToBurn,
            "You are not allowed to burn."
        );

        _burn(account, amount);
    }

    function setPinGalHeroAddress(address pinGalHeroAddress)
        external
        onlyOwner
    {
        PINGALHERO_ADDRESS = pinGalHeroAddress;
    }

    function setAllowedToBurnList(address[] memory allowedToBurnList)
        external
        onlyOwner
    {
        ALLOWED_TO_BURN_LIST = allowedToBurnList;
    }

    function calculateReward(uint256 lastTimeClaimed, uint256 multiplier)
        internal
        view
        returns (uint256 reward)
    {
        uint256 startTime = lastTimeClaimed > 0
            ? lastTimeClaimed
            : TIME_YIELD_START;
        uint256 endTime = block.timestamp < TIME_YIELD_END
            ? block.timestamp
            : TIME_YIELD_END;
        uint256 elapsedTime = calculateElapsedTime(startTime, endTime);

        return elapsedTime * REWARD_PER_SECOND * multiplier;
    }

    function calculateElapsedTime(uint256 startTime, uint256 endTime)
        internal
        pure
        returns (uint256 elapsedTime)
    {
        return startTime >= endTime ? 0 : endTime - startTime;
    }
}

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":"REWARD_MULTIPLIER_PINGALHERO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_MULTIPLIER_PINPLANETS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_YIELD_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_YIELD_START","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"calculatePinGalaxyHeroesReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"calculatePinPlanetsReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimPinGalaxyHeroesReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimPinPlanetsReward","outputs":[],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"pinPlanetsTokenIdsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"allowedToBurnList","type":"address[]"}],"name":"setAllowedToBurnList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pinGalHeroAddress","type":"address"}],"name":"setPinGalHeroAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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"}]

6080604052636302138b60068190556200001e90630784ce0062000348565b600755652c3839d4380060085560646009556001600a55600d80546001600160a01b03191673a808f088391839728897b83849323cf823ab73af1790553480156200006857600080fd5b506040518060400160405280601381526020017f50696e2047616c617879205374617264757374000000000000000000000000008152506040518060400160405280600881526020016714125391d05314d160c21b8152508160039081620000d1919062000408565b506004620000e0828262000408565b505050620000fd620000f7620001ef60201b60201c565b620001f3565b6000600654426200010f9190620004d4565b9050600060095460085483620001269190620004ea565b620001329190620004ea565b905060015b60fa8111620001e657600d546040516331a9108f60e11b8152600481018390526000916001600160a01b031690636352211e90602401602060405180830381865afa1580156200018b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b1919062000504565b9050620001bf818462000245565b506000818152600b6020526040902042905580620001dd8162000536565b91505062000137565b50505062000552565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002a05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620002b4919062000348565b90915550506001600160a01b03821660009081526020819052604081208054839290620002e390849062000348565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156200035e576200035e62000332565b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200038f57607f821691505b602082108103620003b057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032d57600081815260208120601f850160051c81016020861015620003df5750805b601f850160051c820191505b818110156200040057828155600101620003eb565b505050505050565b81516001600160401b0381111562000424576200042462000364565b6200043c816200043584546200037a565b84620003b6565b602080601f8311600181146200047457600084156200045b5750858301515b600019600386901b1c1916600185901b17855562000400565b600085815260208120601f198616915b82811015620004a55788860151825594840194600190910190840162000484565b5085821015620004c45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156200035e576200035e62000332565b80820281158282048414176200035e576200035e62000332565b6000602082840312156200051757600080fd5b81516001600160a01b03811681146200052f57600080fd5b9392505050565b6000600182016200054b576200054b62000332565b5060010190565b61199a80620005626000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063c0c7bcb511610097578063d79c395311610071578063d79c395314610372578063dd62ed3e1461037b578063f2fde38b1461038e578063f8b98509146103a157600080fd5b8063c0c7bcb514610343578063c72c6a051461034c578063c7ce4b471461035f57600080fd5b80638da5cb5b116100d35780638da5cb5b146102fa57806395d89b4114610315578063a457c2d71461031d578063a9059cbb1461033057600080fd5b806370a08231146102b6578063715018a6146102df57806379cc6790146102e757600080fd5b80632717e04c11610166578063395093511161014057806339509351146102675780633eb1392c1461027a5780634fb746c8146102835780635169479f146102a357600080fd5b80632717e04c14610232578063313ce5671461024557806331bab0241461025457600080fd5b80630213c238146101ae57806306fdde03146101ca578063095ea7b3146101df57806318160ddd1461020257806319fd85c21461020a57806323b872dd1461021f575b600080fd5b6101b7600a5481565b6040519081526020015b60405180910390f35b6101d26103aa565b6040516101c19190611537565b6101f26101ed36600461159a565b61043c565b60405190151581526020016101c1565b6002546101b7565b61021d610218366004611631565b610456565b005b6101f261022d3660046116c7565b6106fb565b6101b7610240366004611631565b61071f565b604051601281526020016101c1565b61021d610262366004611708565b61078a565b6101f261027536600461159a565b6107a9565b6101b760065481565b610296610291366004611797565b6107cb565b6040516101c191906117b4565b61021d6102b1366004611631565b610958565b6101b76102c4366004611797565b6001600160a01b031660009081526020819052604090205490565b61021d610b88565b61021d6102f536600461159a565b610b9c565b6005546040516001600160a01b0390911681526020016101c1565b6101d2610c4b565b6101f261032b36600461159a565b610c5a565b6101f261033e36600461159a565b610cd5565b6101b760095481565b61021d61035a366004611797565b610ce3565b6101b761036d366004611631565b610d0d565b6101b760085481565b6101b76103893660046117f8565b610d52565b61021d61039c366004611797565b610d7d565b6101b760075481565b6060600380546103b990611831565b80601f01602080910402602001604051908101604052809291908181526020018280546103e590611831565b80156104325780601f1061040757610100808354040283529160200191610432565b820191906000526020600020905b81548152906001019060200180831161041557829003601f168201915b5050505050905090565b60003361044a818585610df6565b60019150505b92915050565b60008151116104805760405162461bcd60e51b81526004016104779061186b565b60405180910390fd5b600e54815160009182916001600160a01b0390911690636352211e90859084906104ac576104ac6118ac565b60200260200101516040518263ffffffff1660e01b81526004016104d291815260200190565b602060405180830381865afa1580156104ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051391906118c2565b905060005b83518110156106ad57600e5484516001600160a01b0390911690636352211e9086908490811061054a5761054a6118ac565b60200260200101516040518263ffffffff1660e01b815260040161057091815260200190565b602060405180830381865afa15801561058d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b191906118c2565b6001600160a01b0316826001600160a01b0316146106255760405162461bcd60e51b815260206004820152602b60248201527f416c6c206865726f6573206d7573742062656c6f6e6720746f2074686520736160448201526a36b29030b2323932b9b99760a91b6064820152608401610477565b61065d600c600086848151811061063e5761063e6118ac565b6020026020010151815260200190815260200160002054600a54610f1a565b61066790846118f5565b925042600c6000868481518110610680576106806118ac565b602002602001015181526020019081526020016000208190555080806106a590611908565b915050610518565b50600082116106ec5760405162461bcd60e51b815260206004820152600b60248201526a052657761726420697320360ac1b6044820152606401610477565b6106f68183610f79565b505050565b600033610709858285611058565b6107148585856110d2565b506001949350505050565b600080805b835181101561078357610765600b6000868481518110610746576107466118ac565b6020026020010151815260200190815260200160002054600954610f1a565b61076f90836118f5565b91508061077b81611908565b915050610724565b5092915050565b6107926112a0565b80516107a590600f9060208401906114bd565b5050565b60003361044a8185856107bc8383610d52565b6107c691906118f5565b610df6565b600d546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a0823190602401602060405180830381865afa15801561081a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083e9190611921565b905060008167ffffffffffffffff81111561085b5761085b6115c6565b604051908082528060200260200182016040528015610884578160200160208202803683370190505b509050600060015b8382101561094e57600d546040516331a9108f60e11b8152600481018390526001600160a01b03888116921690636352211e90602401602060405180830381865afa1580156108df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090391906118c2565b6001600160a01b03160361093c5780838361091d81611908565b94508151811061092f5761092f6118ac565b6020026020010181815250505b8061094681611908565b91505061088c565b5090949350505050565b60008151116109795760405162461bcd60e51b81526004016104779061186b565b600d54815160009182916001600160a01b0390911690636352211e90859084906109a5576109a56118ac565b60200260200101516040518263ffffffff1660e01b81526004016109cb91815260200190565b602060405180830381865afa1580156109e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0c91906118c2565b905060005b83518110156106ad57600d5484516001600160a01b0390911690636352211e90869084908110610a4357610a436118ac565b60200260200101516040518263ffffffff1660e01b8152600401610a6991815260200190565b602060405180830381865afa158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa91906118c2565b6001600160a01b0316826001600160a01b031614610b1f5760405162461bcd60e51b815260206004820152602c60248201527f416c6c20706c616e657473206d7573742062656c6f6e6720746f20746865207360448201526b30b6b29030b2323932b9b99760a11b6064820152608401610477565b610b38600b6000868481518110610746576107466118ac565b610b4290846118f5565b925042600b6000868481518110610b5b57610b5b6118ac565b60200260200101518152602001908152602001600020819055508080610b8090611908565b915050610a11565b610b906112a0565b610b9a60006112fa565b565b6000805b600f54811015610bf357600f8181548110610bbd57610bbd6118ac565b6000918252602090912001546001600160a01b03163303610be15760019150610bf3565b80610beb81611908565b915050610ba0565b5080610c415760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f7420616c6c6f77656420746f206275726e2e000000006044820152606401610477565b6106f6838361134c565b6060600480546103b990611831565b60003381610c688286610d52565b905083811015610cc85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610477565b6107148286868403610df6565b60003361044a8185856110d2565b610ceb6112a0565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b835181101561078357610d34600c600086848151811061063e5761063e6118ac565b610d3e90836118f5565b915080610d4a81611908565b915050610d12565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610d856112a0565b6001600160a01b038116610dea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610477565b610df3816112fa565b50565b6001600160a01b038316610e585760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610477565b6001600160a01b038216610eb95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610477565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60008060008411610f2d57600654610f2f565b835b905060006007544210610f4457600754610f46565b425b90506000610f54838361149a565b90508460085482610f65919061193a565b610f6f919061193a565b9695505050505050565b6001600160a01b038216610fcf5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610477565b8060026000828254610fe191906118f5565b90915550506001600160a01b0382166000908152602081905260408120805483929061100e9084906118f5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006110648484610d52565b905060001981146110cc57818110156110bf5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610477565b6110cc8484848403610df6565b50505050565b6001600160a01b0383166111365760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610477565b6001600160a01b0382166111985760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610477565b6001600160a01b038316600090815260208190526040902054818110156112105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610477565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906112479084906118f5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161129391815260200190565b60405180910390a36110cc565b6005546001600160a01b03163314610b9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610477565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166113ac5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610477565b6001600160a01b038216600090815260208190526040902054818110156114205760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610477565b6001600160a01b038316600090815260208190526040812083830390556002805484929061144f908490611951565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000818310156114b3576114ae8383611951565b6114b6565b60005b9392505050565b828054828255906000526020600020908101928215611512579160200282015b8281111561151257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906114dd565b5061151e929150611522565b5090565b5b8082111561151e5760008155600101611523565b600060208083528351808285015260005b8181101561156457858101830151858201604001528201611548565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610df357600080fd5b600080604083850312156115ad57600080fd5b82356115b881611585565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611605576116056115c6565b604052919050565b600067ffffffffffffffff821115611627576116276115c6565b5060051b60200190565b6000602080838503121561164457600080fd5b823567ffffffffffffffff81111561165b57600080fd5b8301601f8101851361166c57600080fd5b803561167f61167a8261160d565b6115dc565b81815260059190911b8201830190838101908783111561169e57600080fd5b928401925b828410156116bc578335825292840192908401906116a3565b979650505050505050565b6000806000606084860312156116dc57600080fd5b83356116e781611585565b925060208401356116f781611585565b929592945050506040919091013590565b6000602080838503121561171b57600080fd5b823567ffffffffffffffff81111561173257600080fd5b8301601f8101851361174357600080fd5b803561175161167a8261160d565b81815260059190911b8201830190838101908783111561177057600080fd5b928401925b828410156116bc57833561178881611585565b82529284019290840190611775565b6000602082840312156117a957600080fd5b81356114b681611585565b6020808252825182820181905260009190848201906040850190845b818110156117ec578351835292840192918401916001016117d0565b50909695505050505050565b6000806040838503121561180b57600080fd5b823561181681611585565b9150602083013561182681611585565b809150509250929050565b600181811c9082168061184557607f821691505b60208210810361186557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f596f75206d7573742073656e642061206c697374206f6620746f6b656e2049446040820152607360f81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156118d457600080fd5b81516114b681611585565b634e487b7160e01b600052601160045260246000fd5b80820180821115610450576104506118df565b60006001820161191a5761191a6118df565b5060010190565b60006020828403121561193357600080fd5b5051919050565b8082028115828204841417610450576104506118df565b81810381811115610450576104506118df56fea2646970667358221220a578f9555bcd69143450ed1c0d9a794bf2f7ce1c4e11ffb68f6642fd4c2b55ad64736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063c0c7bcb511610097578063d79c395311610071578063d79c395314610372578063dd62ed3e1461037b578063f2fde38b1461038e578063f8b98509146103a157600080fd5b8063c0c7bcb514610343578063c72c6a051461034c578063c7ce4b471461035f57600080fd5b80638da5cb5b116100d35780638da5cb5b146102fa57806395d89b4114610315578063a457c2d71461031d578063a9059cbb1461033057600080fd5b806370a08231146102b6578063715018a6146102df57806379cc6790146102e757600080fd5b80632717e04c11610166578063395093511161014057806339509351146102675780633eb1392c1461027a5780634fb746c8146102835780635169479f146102a357600080fd5b80632717e04c14610232578063313ce5671461024557806331bab0241461025457600080fd5b80630213c238146101ae57806306fdde03146101ca578063095ea7b3146101df57806318160ddd1461020257806319fd85c21461020a57806323b872dd1461021f575b600080fd5b6101b7600a5481565b6040519081526020015b60405180910390f35b6101d26103aa565b6040516101c19190611537565b6101f26101ed36600461159a565b61043c565b60405190151581526020016101c1565b6002546101b7565b61021d610218366004611631565b610456565b005b6101f261022d3660046116c7565b6106fb565b6101b7610240366004611631565b61071f565b604051601281526020016101c1565b61021d610262366004611708565b61078a565b6101f261027536600461159a565b6107a9565b6101b760065481565b610296610291366004611797565b6107cb565b6040516101c191906117b4565b61021d6102b1366004611631565b610958565b6101b76102c4366004611797565b6001600160a01b031660009081526020819052604090205490565b61021d610b88565b61021d6102f536600461159a565b610b9c565b6005546040516001600160a01b0390911681526020016101c1565b6101d2610c4b565b6101f261032b36600461159a565b610c5a565b6101f261033e36600461159a565b610cd5565b6101b760095481565b61021d61035a366004611797565b610ce3565b6101b761036d366004611631565b610d0d565b6101b760085481565b6101b76103893660046117f8565b610d52565b61021d61039c366004611797565b610d7d565b6101b760075481565b6060600380546103b990611831565b80601f01602080910402602001604051908101604052809291908181526020018280546103e590611831565b80156104325780601f1061040757610100808354040283529160200191610432565b820191906000526020600020905b81548152906001019060200180831161041557829003601f168201915b5050505050905090565b60003361044a818585610df6565b60019150505b92915050565b60008151116104805760405162461bcd60e51b81526004016104779061186b565b60405180910390fd5b600e54815160009182916001600160a01b0390911690636352211e90859084906104ac576104ac6118ac565b60200260200101516040518263ffffffff1660e01b81526004016104d291815260200190565b602060405180830381865afa1580156104ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051391906118c2565b905060005b83518110156106ad57600e5484516001600160a01b0390911690636352211e9086908490811061054a5761054a6118ac565b60200260200101516040518263ffffffff1660e01b815260040161057091815260200190565b602060405180830381865afa15801561058d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b191906118c2565b6001600160a01b0316826001600160a01b0316146106255760405162461bcd60e51b815260206004820152602b60248201527f416c6c206865726f6573206d7573742062656c6f6e6720746f2074686520736160448201526a36b29030b2323932b9b99760a91b6064820152608401610477565b61065d600c600086848151811061063e5761063e6118ac565b6020026020010151815260200190815260200160002054600a54610f1a565b61066790846118f5565b925042600c6000868481518110610680576106806118ac565b602002602001015181526020019081526020016000208190555080806106a590611908565b915050610518565b50600082116106ec5760405162461bcd60e51b815260206004820152600b60248201526a052657761726420697320360ac1b6044820152606401610477565b6106f68183610f79565b505050565b600033610709858285611058565b6107148585856110d2565b506001949350505050565b600080805b835181101561078357610765600b6000868481518110610746576107466118ac565b6020026020010151815260200190815260200160002054600954610f1a565b61076f90836118f5565b91508061077b81611908565b915050610724565b5092915050565b6107926112a0565b80516107a590600f9060208401906114bd565b5050565b60003361044a8185856107bc8383610d52565b6107c691906118f5565b610df6565b600d546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a0823190602401602060405180830381865afa15801561081a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083e9190611921565b905060008167ffffffffffffffff81111561085b5761085b6115c6565b604051908082528060200260200182016040528015610884578160200160208202803683370190505b509050600060015b8382101561094e57600d546040516331a9108f60e11b8152600481018390526001600160a01b03888116921690636352211e90602401602060405180830381865afa1580156108df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090391906118c2565b6001600160a01b03160361093c5780838361091d81611908565b94508151811061092f5761092f6118ac565b6020026020010181815250505b8061094681611908565b91505061088c565b5090949350505050565b60008151116109795760405162461bcd60e51b81526004016104779061186b565b600d54815160009182916001600160a01b0390911690636352211e90859084906109a5576109a56118ac565b60200260200101516040518263ffffffff1660e01b81526004016109cb91815260200190565b602060405180830381865afa1580156109e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0c91906118c2565b905060005b83518110156106ad57600d5484516001600160a01b0390911690636352211e90869084908110610a4357610a436118ac565b60200260200101516040518263ffffffff1660e01b8152600401610a6991815260200190565b602060405180830381865afa158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa91906118c2565b6001600160a01b0316826001600160a01b031614610b1f5760405162461bcd60e51b815260206004820152602c60248201527f416c6c20706c616e657473206d7573742062656c6f6e6720746f20746865207360448201526b30b6b29030b2323932b9b99760a11b6064820152608401610477565b610b38600b6000868481518110610746576107466118ac565b610b4290846118f5565b925042600b6000868481518110610b5b57610b5b6118ac565b60200260200101518152602001908152602001600020819055508080610b8090611908565b915050610a11565b610b906112a0565b610b9a60006112fa565b565b6000805b600f54811015610bf357600f8181548110610bbd57610bbd6118ac565b6000918252602090912001546001600160a01b03163303610be15760019150610bf3565b80610beb81611908565b915050610ba0565b5080610c415760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f7420616c6c6f77656420746f206275726e2e000000006044820152606401610477565b6106f6838361134c565b6060600480546103b990611831565b60003381610c688286610d52565b905083811015610cc85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610477565b6107148286868403610df6565b60003361044a8185856110d2565b610ceb6112a0565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b835181101561078357610d34600c600086848151811061063e5761063e6118ac565b610d3e90836118f5565b915080610d4a81611908565b915050610d12565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610d856112a0565b6001600160a01b038116610dea5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610477565b610df3816112fa565b50565b6001600160a01b038316610e585760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610477565b6001600160a01b038216610eb95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610477565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60008060008411610f2d57600654610f2f565b835b905060006007544210610f4457600754610f46565b425b90506000610f54838361149a565b90508460085482610f65919061193a565b610f6f919061193a565b9695505050505050565b6001600160a01b038216610fcf5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610477565b8060026000828254610fe191906118f5565b90915550506001600160a01b0382166000908152602081905260408120805483929061100e9084906118f5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006110648484610d52565b905060001981146110cc57818110156110bf5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610477565b6110cc8484848403610df6565b50505050565b6001600160a01b0383166111365760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610477565b6001600160a01b0382166111985760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610477565b6001600160a01b038316600090815260208190526040902054818110156112105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610477565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906112479084906118f5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161129391815260200190565b60405180910390a36110cc565b6005546001600160a01b03163314610b9a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610477565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166113ac5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610477565b6001600160a01b038216600090815260208190526040902054818110156114205760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610477565b6001600160a01b038316600090815260208190526040812083830390556002805484929061144f908490611951565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000818310156114b3576114ae8383611951565b6114b6565b60005b9392505050565b828054828255906000526020600020908101928215611512579160200282015b8281111561151257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906114dd565b5061151e929150611522565b5090565b5b8082111561151e5760008155600101611523565b600060208083528351808285015260005b8181101561156457858101830151858201604001528201611548565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610df357600080fd5b600080604083850312156115ad57600080fd5b82356115b881611585565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611605576116056115c6565b604052919050565b600067ffffffffffffffff821115611627576116276115c6565b5060051b60200190565b6000602080838503121561164457600080fd5b823567ffffffffffffffff81111561165b57600080fd5b8301601f8101851361166c57600080fd5b803561167f61167a8261160d565b6115dc565b81815260059190911b8201830190838101908783111561169e57600080fd5b928401925b828410156116bc578335825292840192908401906116a3565b979650505050505050565b6000806000606084860312156116dc57600080fd5b83356116e781611585565b925060208401356116f781611585565b929592945050506040919091013590565b6000602080838503121561171b57600080fd5b823567ffffffffffffffff81111561173257600080fd5b8301601f8101851361174357600080fd5b803561175161167a8261160d565b81815260059190911b8201830190838101908783111561177057600080fd5b928401925b828410156116bc57833561178881611585565b82529284019290840190611775565b6000602082840312156117a957600080fd5b81356114b681611585565b6020808252825182820181905260009190848201906040850190845b818110156117ec578351835292840192918401916001016117d0565b50909695505050505050565b6000806040838503121561180b57600080fd5b823561181681611585565b9150602083013561182681611585565b809150509250929050565b600181811c9082168061184557607f821691505b60208210810361186557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f596f75206d7573742073656e642061206c697374206f6620746f6b656e2049446040820152607360f81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156118d457600080fd5b81516114b681611585565b634e487b7160e01b600052601160045260246000fd5b80820180821115610450576104506118df565b60006001820161191a5761191a6118df565b5060010190565b60006020828403121561193357600080fd5b5051919050565b8082028115828204841417610450576104506118df565b81810381811115610450576104506118df56fea2646970667358221220a578f9555bcd69143450ed1c0d9a794bf2f7ce1c4e11ffb68f6642fd4c2b55ad64736f6c63430008110033

Deployed Bytecode Sourcemap

20590:6076:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20977:47;;;;;;;;;160:25:1;;;148:2;133:18;20977:47:0;;;;;;;;9504:100;;;:::i;:::-;;;;;;;:::i;11855:201::-;;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;11855:201:0;1205:187:1;10624:108:0;10712:12;;10624:108;;24250:852;;;;;;:::i;:::-;;:::i;:::-;;12636:295;;;;;;:::i;:::-;;:::i;22514:429::-;;;;;;:::i;:::-;;:::i;10466:93::-;;;10549:2;3496:36:1;;3484:2;3469:18;10466:93:0;3354:184:1;25745:167:0;;;;;;:::i;:::-;;:::i;13340:238::-;;;;;;:::i;:::-;;:::i;20642:44::-;;;;;;21956:550;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22951:849::-;;;;;;:::i;:::-;;:::i;10795:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10896:18:0;10869:7;10896:18;;;;;;;;;;;;10795:127;2927:103;;;:::i;25110:463::-;;;;;;:::i;:::-;;:::i;2279:87::-;2352:6;;2279:87;;-1:-1:-1;;;;;2352:6:0;;;5549:51:1;;5537:2;5522:18;2279:87:0;5403:203:1;9723:104:0;;;:::i;14081:436::-;;;;;;:::i;:::-;;:::i;11128:193::-;;;;;;:::i;:::-;;:::i;20921:49::-;;;;;;25581:156;;;;;;:::i;:::-;;:::i;23808:434::-;;;;;;:::i;:::-;;:::i;20865:49::-;;;;;;11384:151;;;;;;:::i;:::-;;:::i;3185:201::-;;;;;;:::i;:::-;;:::i;20755:63::-;;;;;;9504:100;9558:13;9591:5;9584:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9504:100;:::o;11855:201::-;11938:4;910:10;11994:32;910:10;12010:7;12019:6;11994:8;:32::i;:::-;12044:4;12037:11;;;11855:201;;;;;:::o;24250:852::-;24359:1;24341:8;:15;:19;24333:65;;;;-1:-1:-1;;;24333:65:0;;;;;;;:::i;:::-;;;;;;;;;24472:18;;24500:11;;24411:14;;;;-1:-1:-1;;;;;24472:18:0;;;;24464:35;;24500:8;;24411:14;;24500:11;;;;:::i;:::-;;;;;;;24464:48;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;24464:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24440:72;;24530:9;24525:482;24549:8;:15;24545:1;:19;24525:482;;;24637:18;;24665:11;;-1:-1:-1;;;;;24637:18:0;;;;24629:35;;24665:8;;24674:1;;24665:11;;;;;;:::i;:::-;;;;;;;24629:48;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;24629:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24612:65:0;:13;-1:-1:-1;;;;;24612:65:0;;24586:169;;;;-1:-1:-1;;;24586:169:0;;7381:2:1;24586:169:0;;;7363:21:1;7420:2;7400:18;;;7393:30;7459:34;7439:18;;;7432:62;-1:-1:-1;;;7510:18:1;;;7503:41;7561:19;;24586:169:0;7179:407:1;24586:169:0;24782:137;24816:28;:41;24845:8;24854:1;24845:11;;;;;;;;:::i;:::-;;;;;;;24816:41;;;;;;;;;;;;24876:28;;24782:15;:137::i;:::-;24772:147;;;;:::i;:::-;;;24980:15;24936:28;:41;24965:8;24974:1;24965:11;;;;;;;;:::i;:::-;;;;;;;24936:41;;;;;;;;;;;:59;;;;24566:3;;;;;:::i;:::-;;;;24525:482;;;;25036:1;25027:6;:10;25019:34;;;;-1:-1:-1;;;25019:34:0;;8195:2:1;25019:34:0;;;8177:21:1;8234:2;8214:18;;;8207:30;-1:-1:-1;;;8253:18:1;;;8246:41;8304:18;;25019:34:0;7993:335:1;25019:34:0;25066:28;25072:13;25087:6;25066:5;:28::i;:::-;24322:780;;24250:852;:::o;12636:295::-;12767:4;910:10;12825:38;12841:4;910:10;12856:6;12825:15;:38::i;:::-;12874:27;12884:4;12890:2;12894:6;12874:9;:27::i;:::-;-1:-1:-1;12919:4:0;;12636:295;-1:-1:-1;;;;12636:295:0:o;22514:429::-;22626:14;;;22688:221;22712:8;:15;22708:1;:19;22688:221;;;22760:137;22794:28;:41;22823:8;22832:1;22823:11;;;;;;;;:::i;:::-;;;;;;;22794:41;;;;;;;;;;;;22854:28;;22760:15;:137::i;:::-;22749:148;;;;:::i;:::-;;-1:-1:-1;22729:3:0;;;;:::i;:::-;;;;22688:221;;;-1:-1:-1;22928:7:0;22514:429;-1:-1:-1;;22514:429:0:o;25745:167::-;2165:13;:11;:13::i;:::-;25864:40;;::::1;::::0;:20:::1;::::0;:40:::1;::::0;::::1;::::0;::::1;:::i;:::-;;25745:167:::0;:::o;13340:238::-;13428:4;910:10;13484:64;910:10;13500:7;13537:10;13509:25;910:10;13500:7;13509:9;:25::i;:::-;:38;;;;:::i;:::-;13484:8;:64::i;21956:550::-;22118:18;;22110:44;;-1:-1:-1;;;22110:44:0;;-1:-1:-1;;;;;5567:32:1;;;22110:44:0;;;5549:51:1;22051:16:0;;22085:22;;22118:18;;;22110:37;;5522:18:1;;22110:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22085:69;;22165:25;22207:14;22193:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22193:29:0;-1:-1:-1;22165:57:0;-1:-1:-1;22233:21:0;22288:1;22271:200;22307:14;22291:13;:30;22271:200;;;22355:18;;22347:38;;-1:-1:-1;;;22347:38:0;;;;;160:25:1;;;-1:-1:-1;;;;;22347:47:0;;;;22355:18;;22347:35;;133:18:1;;22347:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22347:47:0;;22343:117;;22443:1;22415:8;22424:15;;;;:::i;:::-;;;22415:25;;;;;;;;:::i;:::-;;;;;;:29;;;;;22343:117;22323:3;;;;:::i;:::-;;;;22271:200;;;-1:-1:-1;22490:8:0;;21956:550;-1:-1:-1;;;;21956:550:0:o;22951:849::-;23055:1;23037:8;:15;:19;23029:65;;;;-1:-1:-1;;;23029:65:0;;;;;;;:::i;:::-;23168:18;;23196:11;;23107:14;;;;-1:-1:-1;;;;;23168:18:0;;;;23160:35;;23196:8;;23107:14;;23196:11;;;;:::i;:::-;;;;;;;23160:48;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;23160:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23136:72;;23226:9;23221:484;23245:8;:15;23241:1;:19;23221:484;;;23333:18;;23361:11;;-1:-1:-1;;;;;23333:18:0;;;;23325:35;;23361:8;;23370:1;;23361:11;;;;;;:::i;:::-;;;;;;;23325:48;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;23325:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23308:65:0;:13;-1:-1:-1;;;;;23308:65:0;;23282:171;;;;-1:-1:-1;;;23282:171:0;;8724:2:1;23282:171:0;;;8706:21:1;8763:2;8743:18;;;8736:30;8802:34;8782:18;;;8775:62;-1:-1:-1;;;8853:18:1;;;8846:42;8905:19;;23282:171:0;8522:408:1;23282:171:0;23480:137;23514:28;:41;23543:8;23552:1;23543:11;;;;;;;;:::i;23480:137::-;23470:147;;;;:::i;:::-;;;23678:15;23634:28;:41;23663:8;23672:1;23663:11;;;;;;;;:::i;:::-;;;;;;;23634:41;;;;;;;;;;;:59;;;;23262:3;;;;;:::i;:::-;;;;23221:484;;2927:103;2165:13;:11;:13::i;:::-;2992:30:::1;3019:1;2992:18;:30::i;:::-;2927:103::o:0;25110:463::-;25181:20;25224:9;25220:207;25243:20;:27;25239:31;;25220:207;;;25310:20;25331:1;25310:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;25310:23:0;25296:10;:37;25292:124;;25372:4;25354:22;;25395:5;;25292:124;25272:3;;;;:::i;:::-;;;;25220:207;;;;25459:15;25437:93;;;;-1:-1:-1;;;25437:93:0;;9137:2:1;25437:93:0;;;9119:21:1;9176:2;9156:18;;;9149:30;9215;9195:18;;;9188:58;9263:18;;25437:93:0;8935:352:1;25437:93:0;25543:22;25549:7;25558:6;25543:5;:22::i;9723:104::-;9779:13;9812:7;9805:14;;;;;:::i;14081:436::-;14174:4;910:10;14174:4;14257:25;910:10;14274:7;14257:9;:25::i;:::-;14230:52;;14321:15;14301:16;:35;;14293:85;;;;-1:-1:-1;;;14293:85:0;;9494:2:1;14293:85:0;;;9476:21:1;9533:2;9513:18;;;9506:30;9572:34;9552:18;;;9545:62;-1:-1:-1;;;9623:18:1;;;9616:35;9668:19;;14293:85:0;9292:401:1;14293:85:0;14414:60;14423:5;14430:7;14458:15;14439:16;:34;14414:8;:60::i;11128:193::-;11207:4;910:10;11263:28;910:10;11280:2;11284:6;11263:9;:28::i;25581:156::-;2165:13;:11;:13::i;:::-;25691:18:::1;:38:::0;;-1:-1:-1;;;;;;25691:38:0::1;-1:-1:-1::0;;;;;25691:38:0;;;::::1;::::0;;;::::1;::::0;;25581:156::o;23808:434::-;23925:14;;;23987:221;24011:8;:15;24007:1;:19;23987:221;;;24059:137;24093:28;:41;24122:8;24131:1;24122:11;;;;;;;;:::i;24059:137::-;24048:148;;;;:::i;:::-;;-1:-1:-1;24028:3:0;;;;:::i;:::-;;;;23987:221;;11384:151;-1:-1:-1;;;;;11500:18:0;;;11473:7;11500:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11384:151::o;3185:201::-;2165:13;:11;:13::i;:::-;-1:-1:-1;;;;;3274:22:0;::::1;3266:73;;;::::0;-1:-1:-1;;;3266:73:0;;9900:2:1;3266:73:0::1;::::0;::::1;9882:21:1::0;9939:2;9919:18;;;9912:30;9978:34;9958:18;;;9951:62;-1:-1:-1;;;10029:18:1;;;10022:36;10075:19;;3266:73:0::1;9698:402:1::0;3266:73:0::1;3350:28;3369:8;3350:18;:28::i;:::-;3185:201:::0;:::o;17706:380::-;-1:-1:-1;;;;;17842:19:0;;17834:68;;;;-1:-1:-1;;;17834:68:0;;10307:2:1;17834:68:0;;;10289:21:1;10346:2;10326:18;;;10319:30;10385:34;10365:18;;;10358:62;-1:-1:-1;;;10436:18:1;;;10429:34;10480:19;;17834:68:0;10105:400:1;17834:68:0;-1:-1:-1;;;;;17921:21:0;;17913:68;;;;-1:-1:-1;;;17913:68:0;;10712:2:1;17913:68:0;;;10694:21:1;10751:2;10731:18;;;10724:30;10790:34;10770:18;;;10763:62;-1:-1:-1;;;10841:18:1;;;10834:32;10883:19;;17913:68:0;10510:398:1;17913:68:0;-1:-1:-1;;;;;17994:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18046:32;;160:25:1;;;18046:32:0;;133:18:1;18046:32:0;;;;;;;17706:380;;;:::o;25920:521::-;26040:14;26072:17;26110:1;26092:15;:19;:82;;26158:16;;26092:82;;;26127:15;26092:82;26072:102;;26185:15;26221:14;;26203:15;:32;:93;;26282:14;;26203:93;;;26251:15;26203:93;26185:111;;26307:19;26329:40;26350:9;26361:7;26329:20;:40::i;:::-;26307:62;;26423:10;26403:17;;26389:11;:31;;;;:::i;:::-;:44;;;;:::i;:::-;26382:51;25920:521;-1:-1:-1;;;;;;25920:521:0:o;15945:399::-;-1:-1:-1;;;;;16029:21:0;;16021:65;;;;-1:-1:-1;;;16021:65:0;;11288:2:1;16021:65:0;;;11270:21:1;11327:2;11307:18;;;11300:30;11366:33;11346:18;;;11339:61;11417:18;;16021:65:0;11086:355:1;16021:65:0;16177:6;16161:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;16194:18:0;;:9;:18;;;;;;;;;;:28;;16216:6;;16194:9;:28;;16216:6;;16194:28;:::i;:::-;;;;-1:-1:-1;;16238:37:0;;160:25:1;;;-1:-1:-1;;;;;16238:37:0;;;16255:1;;16238:37;;148:2:1;133:18;16238:37:0;;;;;;;25864:40:::1;25745:167:::0;:::o;18377:453::-;18512:24;18539:25;18549:5;18556:7;18539:9;:25::i;:::-;18512:52;;-1:-1:-1;;18579:16:0;:37;18575:248;;18661:6;18641:16;:26;;18633:68;;;;-1:-1:-1;;;18633:68:0;;11648:2:1;18633:68:0;;;11630:21:1;11687:2;11667:18;;;11660:30;11726:31;11706:18;;;11699:59;11775:18;;18633:68:0;11446:353:1;18633:68:0;18745:51;18754:5;18761:7;18789:6;18770:16;:25;18745:8;:51::i;:::-;18501:329;18377:453;;;:::o;14987:671::-;-1:-1:-1;;;;;15118:18:0;;15110:68;;;;-1:-1:-1;;;15110:68:0;;12006:2:1;15110:68:0;;;11988:21:1;12045:2;12025:18;;;12018:30;12084:34;12064:18;;;12057:62;-1:-1:-1;;;12135:18:1;;;12128:35;12180:19;;15110:68:0;11804:401:1;15110:68:0;-1:-1:-1;;;;;15197:16:0;;15189:64;;;;-1:-1:-1;;;15189:64:0;;12412:2:1;15189:64:0;;;12394:21:1;12451:2;12431:18;;;12424:30;12490:34;12470:18;;;12463:62;-1:-1:-1;;;12541:18:1;;;12534:33;12584:19;;15189:64:0;12210:399:1;15189:64:0;-1:-1:-1;;;;;15339:15:0;;15317:19;15339:15;;;;;;;;;;;15373:21;;;;15365:72;;;;-1:-1:-1;;;15365:72:0;;12816:2:1;15365:72:0;;;12798:21:1;12855:2;12835:18;;;12828:30;12894:34;12874:18;;;12867:62;-1:-1:-1;;;12945:18:1;;;12938:36;12991:19;;15365:72:0;12614:402:1;15365:72:0;-1:-1:-1;;;;;15473:15:0;;;:9;:15;;;;;;;;;;;15491:20;;;15473:38;;15533:13;;;;;;;;:23;;15505:6;;15473:9;15533:23;;15505:6;;15533:23;:::i;:::-;;;;;;;;15589:2;-1:-1:-1;;;;;15574:26:0;15583:4;-1:-1:-1;;;;;15574:26:0;;15593:6;15574:26;;;;160:25:1;;148:2;133:18;;14:177;15574:26:0;;;;;;;;15613:37;24250:852;2444:132;2352:6;;-1:-1:-1;;;;;2352:6:0;910:10;2508:23;2500:68;;;;-1:-1:-1;;;2500:68:0;;13223:2:1;2500:68:0;;;13205:21:1;;;13242:18;;;13235:30;13301:34;13281:18;;;13274:62;13353:18;;2500:68:0;13021:356:1;3546:191:0;3639:6;;;-1:-1:-1;;;;;3656:17:0;;;-1:-1:-1;;;;;;3656:17:0;;;;;;;3689:40;;3639:6;;;3656:17;3639:6;;3689:40;;3620:16;;3689:40;3609:128;3546:191;:::o;16677:591::-;-1:-1:-1;;;;;16761:21:0;;16753:67;;;;-1:-1:-1;;;16753:67:0;;13584:2:1;16753:67:0;;;13566:21:1;13623:2;13603:18;;;13596:30;13662:34;13642:18;;;13635:62;-1:-1:-1;;;13713:18:1;;;13706:31;13754:19;;16753:67:0;13382:397:1;16753:67:0;-1:-1:-1;;;;;16920:18:0;;16895:22;16920:18;;;;;;;;;;;16957:24;;;;16949:71;;;;-1:-1:-1;;;16949:71:0;;13986:2:1;16949:71:0;;;13968:21:1;14025:2;14005:18;;;13998:30;14064:34;14044:18;;;14037:62;-1:-1:-1;;;14115:18:1;;;14108:32;14157:19;;16949:71:0;13784:398:1;16949:71:0;-1:-1:-1;;;;;17056:18:0;;:9;:18;;;;;;;;;;17077:23;;;17056:44;;17122:12;:22;;17094:6;;17056:9;17122:22;;17094:6;;17122:22;:::i;:::-;;;;-1:-1:-1;;17162:37:0;;160:25:1;;;17188:1:0;;-1:-1:-1;;;;;17162:37:0;;;;;148:2:1;133:18;17162:37:0;;;;;;;24322:780;;24250:852;:::o;26449:214::-;26565:19;26622:7;26609:9;:20;;:46;;26636:19;26646:9;26636:7;:19;:::i;:::-;26609:46;;;26632:1;26609:46;26602:53;26449:214;-1:-1:-1;;;26449:214:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:548:1;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:127::-;1458:10;1453:3;1449:20;1446:1;1439:31;1489:4;1486:1;1479:15;1513:4;1510:1;1503:15;1529:275;1600:2;1594:9;1665:2;1646:13;;-1:-1:-1;;1642:27:1;1630:40;;1700:18;1685:34;;1721:22;;;1682:62;1679:88;;;1747:18;;:::i;:::-;1783:2;1776:22;1529:275;;-1:-1:-1;1529:275:1:o;1809:183::-;1869:4;1902:18;1894:6;1891:30;1888:56;;;1924:18;;:::i;:::-;-1:-1:-1;1969:1:1;1965:14;1981:4;1961:25;;1809:183::o;1997:891::-;2081:6;2112:2;2155;2143:9;2134:7;2130:23;2126:32;2123:52;;;2171:1;2168;2161:12;2123:52;2211:9;2198:23;2244:18;2236:6;2233:30;2230:50;;;2276:1;2273;2266:12;2230:50;2299:22;;2352:4;2344:13;;2340:27;-1:-1:-1;2330:55:1;;2381:1;2378;2371:12;2330:55;2417:2;2404:16;2440:60;2456:43;2496:2;2456:43;:::i;:::-;2440:60;:::i;:::-;2534:15;;;2616:1;2612:10;;;;2604:19;;2600:28;;;2565:12;;;;2640:19;;;2637:39;;;2672:1;2669;2662:12;2637:39;2696:11;;;;2716:142;2732:6;2727:3;2724:15;2716:142;;;2798:17;;2786:30;;2749:12;;;;2836;;;;2716:142;;;2877:5;1997:891;-1:-1:-1;;;;;;;1997:891:1:o;2893:456::-;2970:6;2978;2986;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;3094:9;3081:23;3113:31;3138:5;3113:31;:::i;:::-;3163:5;-1:-1:-1;3220:2:1;3205:18;;3192:32;3233:33;3192:32;3233:33;:::i;:::-;2893:456;;3285:7;;-1:-1:-1;;;3339:2:1;3324:18;;;;3311:32;;2893:456::o;3543:966::-;3627:6;3658:2;3701;3689:9;3680:7;3676:23;3672:32;3669:52;;;3717:1;3714;3707:12;3669:52;3757:9;3744:23;3790:18;3782:6;3779:30;3776:50;;;3822:1;3819;3812:12;3776:50;3845:22;;3898:4;3890:13;;3886:27;-1:-1:-1;3876:55:1;;3927:1;3924;3917:12;3876:55;3963:2;3950:16;3986:60;4002:43;4042:2;4002:43;:::i;3986:60::-;4080:15;;;4162:1;4158:10;;;;4150:19;;4146:28;;;4111:12;;;;4186:19;;;4183:39;;;4218:1;4215;4208:12;4183:39;4242:11;;;;4262:217;4278:6;4273:3;4270:15;4262:217;;;4358:3;4345:17;4375:31;4400:5;4375:31;:::i;:::-;4419:18;;4295:12;;;;4457;;;;4262:217;;4514:247;4573:6;4626:2;4614:9;4605:7;4601:23;4597:32;4594:52;;;4642:1;4639;4632:12;4594:52;4681:9;4668:23;4700:31;4725:5;4700:31;:::i;4766:632::-;4937:2;4989:21;;;5059:13;;4962:18;;;5081:22;;;4908:4;;4937:2;5160:15;;;;5134:2;5119:18;;;4908:4;5203:169;5217:6;5214:1;5211:13;5203:169;;;5278:13;;5266:26;;5347:15;;;;5312:12;;;;5239:1;5232:9;5203:169;;;-1:-1:-1;5389:3:1;;4766:632;-1:-1:-1;;;;;;4766:632:1:o;5611:388::-;5679:6;5687;5740:2;5728:9;5719:7;5715:23;5711:32;5708:52;;;5756:1;5753;5746:12;5708:52;5795:9;5782:23;5814:31;5839:5;5814:31;:::i;:::-;5864:5;-1:-1:-1;5921:2:1;5906:18;;5893:32;5934:33;5893:32;5934:33;:::i;:::-;5986:7;5976:17;;;5611:388;;;;;:::o;6004:380::-;6083:1;6079:12;;;;6126;;;6147:61;;6201:4;6193:6;6189:17;6179:27;;6147:61;6254:2;6246:6;6243:14;6223:18;6220:38;6217:161;;6300:10;6295:3;6291:20;6288:1;6281:31;6335:4;6332:1;6325:15;6363:4;6360:1;6353:15;6217:161;;6004:380;;;:::o;6389:397::-;6591:2;6573:21;;;6630:2;6610:18;;;6603:30;6669:34;6664:2;6649:18;;6642:62;-1:-1:-1;;;6735:2:1;6720:18;;6713:31;6776:3;6761:19;;6389:397::o;6791:127::-;6852:10;6847:3;6843:20;6840:1;6833:31;6883:4;6880:1;6873:15;6907:4;6904:1;6897:15;6923:251;6993:6;7046:2;7034:9;7025:7;7021:23;7017:32;7014:52;;;7062:1;7059;7052:12;7014:52;7094:9;7088:16;7113:31;7138:5;7113:31;:::i;7591:127::-;7652:10;7647:3;7643:20;7640:1;7633:31;7683:4;7680:1;7673:15;7707:4;7704:1;7697:15;7723:125;7788:9;;;7809:10;;;7806:36;;;7822:18;;:::i;7853:135::-;7892:3;7913:17;;;7910:43;;7933:18;;:::i;:::-;-1:-1:-1;7980:1:1;7969:13;;7853:135::o;8333:184::-;8403:6;8456:2;8444:9;8435:7;8431:23;8427:32;8424:52;;;8472:1;8469;8462:12;8424:52;-1:-1:-1;8495:16:1;;8333:184;-1:-1:-1;8333:184:1:o;10913:168::-;10986:9;;;11017;;11034:15;;;11028:22;;11014:37;11004:71;;11055:18;;:::i;14187:128::-;14254:9;;;14275:11;;;14272:37;;;14289:18;;:::i

Swarm Source

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