ETH Price: $3,328.02 (+1.93%)
Gas: 6 Gwei

Token

GRAPES (GRAPES)
 

Overview

Max Total Supply

869,919 GRAPES

Holders

230

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
fk404.eth
Balance
2,274 GRAPES

Value
$0.00
0xf942ce6643bc80d0bcc1bea4fd4657e600a1de88
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:
odycstaking

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-31
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/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



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() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.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);

    /**
     * @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: @openzeppelin/contracts/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



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:
     *
     * - `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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `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 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 {}
}

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



pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}


pragma solidity ^0.8.4;



interface DuckNFT {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}
interface DucklingNFT {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}
interface AlphaNFT {
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
}

contract odycstaking is ERC20Burnable, Ownable {
    uint256 public constant MAX_SUPPLY = 200000000 * 1 ether;
    uint256 public constant ALPHA_EMISSION_RATE = 17; // 17 per day
    uint256 public constant DUCK_EMISSION_RATE = 10; // 10 per day
    uint256 public constant DUCKLING_EMISSION_RATE = 5; // 5 per day
    address public DUCK_ADDRESS = 0x36D7b711390D34e8fe26ad8f2bB14E7C8f0c56e9; 
    address public DUCKLING_ADDRESS = 0xeB4A28587503d84dc29DE8e4Fc8bF0A57A7Ddb0d;
    address public ALPHA_ADDRESS = 0x258cc47A6C4fb69458F87825d8E3f7B57c90748D;
    bool public live = false;

    mapping(uint256 => uint256) internal duckTimeStaked;
    mapping(uint256 => address) internal duckStaker;
    mapping(address => uint256[]) internal stakerToDuck;
    
    mapping(uint256 => uint256) internal ducklingTimeStaked;
    mapping(uint256 => address) internal ducklingStaker;
    mapping(address => uint256[]) internal stakerToDuckling;
    
    mapping(uint256 => uint256) internal alphaTimeStaked;
    mapping(uint256 => address) internal alphaStaker;
    mapping(address => uint256[]) internal stakerToAlpha;


    DuckNFT private _duckContract = DuckNFT(DUCK_ADDRESS);
    DucklingNFT private _ducklingContract = DucklingNFT(DUCKLING_ADDRESS);
    AlphaNFT private _alphaContract = AlphaNFT(ALPHA_ADDRESS);

    constructor() ERC20("GRAPES", "GRAPES") {
        _mint(msg.sender, 2100 * 1 ether);
    }

    modifier stakingEnabled {
        require(live, "NOT_LIVE");
        _;
    }

    function getStakedDuck(address staker) public view returns (uint256[] memory) {
        return stakerToDuck[staker];
    }
    
    function getStakedAmount(address staker) public view returns (uint256) {
        return stakerToDuck[staker].length;
    }

    function getDuckStaker(uint256 tokenId) public view returns (address) {
        return duckStaker[tokenId];
    }

    function getStakedDuckling(address staker) public view returns (uint256[] memory) {
        return stakerToDuckling[staker];
    }
    
    function getDucklingStakedAmount(address staker) public view returns (uint256) {
        return stakerToDuckling[staker].length;
    }

    function getDucklingStaker(uint256 tokenId) public view returns (address) {
        return ducklingStaker[tokenId];
    }

    function getStakedAlpha(address staker) public view returns (uint256[] memory) {
        return stakerToAlpha[staker];
    }
    
    function getAlphaStakedAmount(address staker) public view returns (uint256) {
        return stakerToAlpha[staker].length;
    }

    function getAlphaStaker(uint256 tokenId) public view returns (address) {
        return alphaStaker[tokenId];
    }

    function getAllRewards(address staker) public view returns (uint256) {
        uint256 totalRewards = 0;

        uint256[] memory duckTokens = stakerToDuck[staker];
        for (uint256 i = 0; i < duckTokens.length; i++) {
            totalRewards += getReward(duckTokens[i]);
        }

        uint256[] memory ducklingTokens = stakerToDuckling[staker];
        for (uint256 i = 0; i < ducklingTokens.length; i++) {
            totalRewards += getDucklingReward(ducklingTokens[i]);
        }

        uint256[] memory alphaTokens = stakerToAlpha[staker];
        for (uint256 i = 0; i < alphaTokens.length; i++) {
            totalRewards += getAlphaReward(alphaTokens[i]);
        }

        return totalRewards;
    }

    function stakeDuckById(uint256[] calldata tokenIds) external stakingEnabled {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _duckContract.transferFrom(msg.sender, address(this), id);

            stakerToDuck[msg.sender].push(id);
            duckTimeStaked[id] = block.timestamp;
            duckStaker[id] = msg.sender;
        }
    }

    function unstakeDuckByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(duckStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _duckContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            removeTokenIdFromArray(stakerToDuck[msg.sender], id);
            duckStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function stakeDucklingsById(uint256[] calldata tokenIds) external stakingEnabled {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _ducklingContract.transferFrom(msg.sender, address(this), id);

            stakerToDuckling[msg.sender].push(id);
            ducklingTimeStaked[id] = block.timestamp;
            ducklingStaker[id] = msg.sender;
        }
    }

    function unstakeDucklingsByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(ducklingStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _ducklingContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            removeTokenIdFromArray(stakerToDuckling[msg.sender], id);
            ducklingStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function stakeAlphaById(uint256[] calldata tokenIds) external stakingEnabled {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            _alphaContract.transferFrom(msg.sender, address(this), id);

            stakerToAlpha[msg.sender].push(id);
            alphaTimeStaked[id] = block.timestamp;
            alphaStaker[id] = msg.sender;
        }
    }

    function unstakeAlphaByIds(uint256[] calldata tokenIds) external {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(alphaStaker[id] == msg.sender, "NEEDS_TO_BE_OWNER");

            _alphaContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            removeTokenIdFromArray(stakerToAlpha[msg.sender], id);
            alphaStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function unstakeAll() external {
        require(getStakedAmount(msg.sender) > 0 || getDucklingStakedAmount(msg.sender) > 0 || getAlphaStakedAmount(msg.sender) > 0, "None Staked");
        uint256 totalRewards = 0;

        for (uint256 i = stakerToDuck[msg.sender].length; i > 0; i--) {
            uint256 id = stakerToDuck[msg.sender][i - 1];

            _duckContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getReward(id);

            stakerToDuck[msg.sender].pop();
            duckStaker[id] = address(0);
        }

        for (uint256 i = stakerToDuckling[msg.sender].length; i > 0; i--) {
            uint256 id = stakerToDuckling[msg.sender][i - 1];

            _ducklingContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getDucklingReward(id);

            stakerToDuckling[msg.sender].pop();
            ducklingStaker[id] = address(0);
        }

        for (uint256 i = stakerToAlpha[msg.sender].length; i > 0; i--) {
            uint256 id = stakerToAlpha[msg.sender][i - 1];

            _alphaContract.transferFrom(address(this), msg.sender, id);
            totalRewards += getAlphaReward(id);

            stakerToAlpha[msg.sender].pop();
            alphaStaker[id] = address(0);
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }

    function claimAll() external {
        uint256 totalRewards = 0;

        uint256[] memory duckTokens = stakerToDuck[msg.sender];
        for (uint256 i = 0; i < duckTokens.length; i++) {
            uint256 id = duckTokens[i];

            totalRewards += getReward(duckTokens[i]);
            duckTimeStaked[id] = block.timestamp;
        }

        uint256[] memory ducklingTokens = stakerToDuckling[msg.sender];
        for (uint256 i = 0; i < ducklingTokens.length; i++) {
            uint256 id = ducklingTokens[i];

            totalRewards += getDucklingReward(ducklingTokens[i]);
            ducklingTimeStaked[id] = block.timestamp;
        }

        uint256[] memory alphaTokens = stakerToAlpha[msg.sender];
        for (uint256 i = 0; i < alphaTokens.length; i++) {
            uint256 id = alphaTokens[i];

            totalRewards += getAlphaReward(alphaTokens[i]);
            alphaTimeStaked[id] = block.timestamp;
        }

        uint256 remaining = MAX_SUPPLY - totalSupply();
        _mint(msg.sender, totalRewards > remaining ? remaining : totalRewards);
    }


    function burn(address from, uint256 amount) external {
        _burn(from, amount);
    }

    function setAlphaAddress(address ALPHA_ADDRESS_) public onlyOwner {
        ALPHA_ADDRESS = ALPHA_ADDRESS_;
    }
    
    function toggle() external onlyOwner {
        live = !live;
    }

    function getReward(uint256 tokenId) internal view returns(uint256) {
        return (block.timestamp - duckTimeStaked[tokenId]) * DUCK_EMISSION_RATE / 86400 * 1 ether;
    }

    function getDucklingReward(uint256 tokenId) internal view returns(uint256) {
        return (block.timestamp - ducklingTimeStaked[tokenId]) * DUCKLING_EMISSION_RATE / 86400 * 1 ether;
    }

    function getAlphaReward(uint256 tokenId) internal view returns(uint256) {
        return (block.timestamp - alphaTimeStaked[tokenId]) * ALPHA_EMISSION_RATE / 86400 * 1 ether;
    }

    function removeTokenIdFromArray(uint256[] storage array, uint256 tokenId) internal {
        uint256 length = array.length;
        for (uint256 i = 0; i < length; i++) {
            if (array[i] == tokenId) {
                length--;
                if (i < length) {
                    array[i] = array[length];
                }
                array.pop();
                break;
            }
        }
    }
}

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":"ALPHA_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ALPHA_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCKLING_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCKLING_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCK_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DUCK_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","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":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","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":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAlphaStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAlphaStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDuckStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getDucklingStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDucklingStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedAlpha","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedDuck","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedDuckling","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","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":"live","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ALPHA_ADDRESS_","type":"address"}],"name":"setAlphaAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeAlphaById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeDuckById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeDucklingsById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggle","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeAlphaByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeDuckByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeDucklingsByIds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600680546001600160a01b03199081167336d7b711390d34e8fe26ad8f2bb14e7c8f0c56e990811790925560078054821673eb4a28587503d84dc29de8e4fc8bf0a57a7ddb0d908117909155600880546001600160a81b03191673258cc47a6c4fb69458f87825d8e3f7b57c90748d9081179091556012805484169094179093556013805483169091179055601480549091169091179055348015620000a957600080fd5b5060408051808201825260068082526547524150455360d01b602080840182815285518087019096529285528401528151919291620000eb9160039162000277565b5080516200010190600490602084019062000277565b5050506200011e620001186200013960201b60201c565b6200013d565b62000133336871d75ab9b9205000006200018f565b62000381565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620001ea5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620001fe91906200031d565b90915550506001600160a01b038216600090815260208190526040812080548392906200022d9084906200031d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620002859062000344565b90600052602060002090601f016020900481019282620002a95760008555620002f4565b82601f10620002c457805160ff1916838001178555620002f4565b82800160010185558215620002f4579182015b82811115620002f4578251825591602001919060010190620002d7565b506200030292915062000306565b5090565b5b8082111562000302576000815560010162000307565b600082198211156200033f57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200035957607f821691505b602082108114156200037b57634e487b7160e01b600052602260045260246000fd5b50919050565b6126d580620003916000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c8063715018a61161015c578063bb93a4e6116100ce578063dd62ed3e11610087578063dd62ed3e146105e6578063e6923cf81461061f578063ecce866514610632578063ed56690014610645578063f2031a9914610658578063f2fde38b1461066b57600080fd5b8063bb93a4e61461057f578063c3b334c0146105a8578063c80d491b146105bb578063c9ecc9dd146105ce578063d1058e59146105d6578063d25d5a7b146105de57600080fd5b806395d89b411161012057806395d89b41146105185780639dc29fac14610520578063a05287c314610533578063a457c2d714610546578063a9059cbb14610559578063b3fb20cf1461056c57600080fd5b8063715018a6146104af578063774464f5146104b757806379cc6790146104e05780638da5cb5b146104f3578063957aa58c1461050457600080fd5b8063363da4c9116101f557806342966c68116101b957806342966c681461040457806349a2f1f2146104175780634a2ba8e71461042a5780634da6a5561461044a57806358620c3a1461047357806370a082311461048657600080fd5b8063363da4c9146103a557806339509351146103ce5780633bedb844146103e157806340a3d246146103f457806340bfa012146103fc57600080fd5b80632203cf45116102475780632203cf451461034157806323b872dd14610356578063313ce5671461036957806332cb6b0c1461037857806335322f371461038a578063362a3fad1461039257600080fd5b806306fdde0314610284578063093a2455146102a2578063095ea7b3146102e357806318160ddd146103065780631d3a53c014610318575b600080fd5b61028c61067e565b60405161029991906122dc565b60405180910390f35b6102cb6102b0366004612331565b6000908152601060205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610299565b6102f66102f1366004612366565b610710565b6040519015158152602001610299565b6002545b604051908152602001610299565b61030a610326366004612390565b6001600160a01b03166000908152600e602052604090205490565b61035461034f3660046123b2565b610726565b005b6102f6610364366004612427565b610897565b60405160128152602001610299565b61030a6aa56fa5b99019a5c800000081565b610354610941565b61030a6103a0366004612390565b610d86565b6102cb6103b3366004612331565b6000908152600a60205260409020546001600160a01b031690565b6102f66103dc366004612366565b610fae565b6103546103ef3660046123b2565b610fea565b610354611108565b61030a600a81565b610354610412366004612331565b611153565b6103546104253660046123b2565b611160565b61043d610438366004612390565b611288565b6040516102999190612463565b61030a610458366004612390565b6001600160a01b03166000908152600b602052604090205490565b6006546102cb906001600160a01b031681565b61030a610494366004612390565b6001600160a01b031660009081526020819052604090205490565b6103546112f4565b6102cb6104c5366004612331565b6000908152600d60205260409020546001600160a01b031690565b6103546104ee366004612366565b61132a565b6005546001600160a01b03166102cb565b6008546102f690600160a01b900460ff1681565b61028c6113ab565b61035461052e366004612366565b6113ba565b6103546105413660046123b2565b6113c4565b6102f6610554366004612366565b6114dd565b6102f6610567366004612366565b611576565b61043d61057a366004612390565b611583565b61030a61058d366004612390565b6001600160a01b031660009081526011602052604090205490565b6103546105b63660046123b2565b6115ed565b6008546102cb906001600160a01b031681565b61030a601181565b610354611715565b61030a600581565b61030a6105f43660046124a7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6007546102cb906001600160a01b031681565b610354610640366004612390565b6119b6565b61043d610653366004612390565b611a02565b6103546106663660046123b2565b611a6c565b610354610679366004612390565b611b85565b60606003805461068d906124da565b80601f01602080910402602001604051908101604052809291908181526020018280546106b9906124da565b80156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b5050505050905090565b600061071d338484611c1d565b50600192915050565b6000805b8281101561085757600084848381811061074657610746612515565b602090810292909201356000818152600d909352604090922054919250506001600160a01b031633146107945760405162461bcd60e51b815260040161078b9061252b565b60405180910390fd5b6013546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906107c890309033908690600401612556565b600060405180830381600087803b1580156107e257600080fd5b505af11580156107f6573d6000803e3d6000fd5b5050505061080381611d41565b61080d9084612590565b336000908152600e602052604090209093506108299082611d8e565b6000908152600d6020526040902080546001600160a01b03191690558061084f816125a8565b91505061072a565b50600061086360025490565b610878906aa56fa5b99019a5c80000006125c3565b90506108913382841161088b5783611e4d565b82611e4d565b50505050565b60006108a4848484611f2c565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109295760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161078b565b6109368533858403611c1d565b506001949350505050565b336000908152600b6020526040812054118061096a5750336000908152600e6020526040812054115b80610982575033600090815260116020526040812054115b6109bc5760405162461bcd60e51b815260206004820152600b60248201526a139bdb994814dd185ad95960aa1b604482015260640161078b565b336000908152600b60205260408120545b8015610aec57336000908152600b602052604081206109ed6001846125c3565b815481106109fd576109fd612515565b6000918252602090912001546012546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610a3e90309033908690600401612556565b600060405180830381600087803b158015610a5857600080fd5b505af1158015610a6c573d6000803e3d6000fd5b50505050610a7981611d41565b610a839084612590565b336000908152600b6020526040902080549194509080610aa557610aa56125da565b600082815260208082208301600019908101839055909201909255918152600a9091526040902080546001600160a01b031916905580610ae4816125f0565b9150506109cd565b50336000908152600e60205260409020545b8015610c1d57336000908152600e60205260408120610b1e6001846125c3565b81548110610b2e57610b2e612515565b6000918252602090912001546013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610b6f90309033908690600401612556565b600060405180830381600087803b158015610b8957600080fd5b505af1158015610b9d573d6000803e3d6000fd5b50505050610baa816120fa565b610bb49084612590565b336000908152600e6020526040902080549194509080610bd657610bd66125da565b600082815260208082208301600019908101839055909201909255918152600d9091526040902080546001600160a01b031916905580610c15816125f0565b915050610afe565b50336000908152601160205260409020545b8015610d4e57336000908152601160205260408120610c4f6001846125c3565b81548110610c5f57610c5f612515565b6000918252602090912001546014546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610ca090309033908690600401612556565b600060405180830381600087803b158015610cba57600080fd5b505af1158015610cce573d6000803e3d6000fd5b50505050610cdb8161211b565b610ce59084612590565b33600090815260116020526040902080549194509080610d0757610d076125da565b60008281526020808220830160001990810183905590920190925591815260109091526040902080546001600160a01b031916905580610d46816125f0565b915050610c2f565b506000610d5a60025490565b610d6f906aa56fa5b99019a5c80000006125c3565b9050610d823382841161088b5783611e4d565b5050565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835284938493929190830182828015610de857602002820191906000526020600020905b815481526020019060010190808311610dd4575b5050505050905060005b8151811015610e3b57610e1d828281518110610e1057610e10612515565b6020026020010151611d41565b610e279084612590565b925080610e33816125a8565b915050610df2565b506001600160a01b0384166000908152600e6020908152604080832080548251818502810185019093528083529192909190830182828015610e9c57602002820191906000526020600020905b815481526020019060010190808311610e88575b5050505050905060005b8151811015610eef57610ed1828281518110610ec457610ec4612515565b60200260200101516120fa565b610edb9085612590565b935080610ee7816125a8565b915050610ea6565b506001600160a01b038516600090815260116020908152604080832080548251818502810185019093528083529192909190830182828015610f5057602002820191906000526020600020905b815481526020019060010190808311610f3c575b5050505050905060005b8151811015610fa357610f85828281518110610f7857610f78612515565b602002602001015161211b565b610f8f9086612590565b945080610f9b816125a8565b915050610f5a565b509295945050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161071d918590610fe5908690612590565b611c1d565b600854600160a01b900460ff166110135760405162461bcd60e51b815260040161078b90612607565b60005b8181101561110357600083838381811061103257611032612515565b6012546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd915061107390339030908690600401612556565b600060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b5050336000818152600b6020908152604080832080546001810182559084528284200187905595825260098152858220429055600a90529390932080546001600160a01b031916909317909255508190506110fb816125a8565b915050611016565b505050565b6005546001600160a01b031633146111325760405162461bcd60e51b815260040161078b90612629565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b61115d338261213c565b50565b6000805b8281101561085757600084848381811061118057611180612515565b6020908102929092013560008181526010909352604090922054919250506001600160a01b031633146111c55760405162461bcd60e51b815260040161078b9061252b565b6014546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906111f990309033908690600401612556565b600060405180830381600087803b15801561121357600080fd5b505af1158015611227573d6000803e3d6000fd5b5050505061123481611d41565b61123e9084612590565b33600090815260116020526040902090935061125a9082611d8e565b600090815260106020526040902080546001600160a01b031916905580611280816125a8565b915050611164565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156112e857602002820191906000526020600020905b8154815260200190600101908083116112d4575b50505050509050919050565b6005546001600160a01b0316331461131e5760405162461bcd60e51b815260040161078b90612629565b611328600061228a565b565b600061133683336105f4565b9050818110156113945760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161078b565b6113a18333848403611c1d565b611103838361213c565b60606004805461068d906124da565b610d82828261213c565b600854600160a01b900460ff166113ed5760405162461bcd60e51b815260040161078b90612607565b60005b8181101561110357600083838381811061140c5761140c612515565b6013546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd915061144d90339030908690600401612556565b600060405180830381600087803b15801561146757600080fd5b505af115801561147b573d6000803e3d6000fd5b5050336000818152600e60209081526040808320805460018101825590845282842001879055958252600c8152858220429055600d90529390932080546001600160a01b031916909317909255508190506114d5816125a8565b9150506113f0565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561155f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161078b565b61156c3385858403611c1d565b5060019392505050565b600061071d338484611f2c565b6001600160a01b0381166000908152601160209081526040918290208054835181840281018401909452808452606093928301828280156112e857602002820191906000526020600020908154815260200190600101908083116112d45750505050509050919050565b6000805b8281101561085757600084848381811061160d5761160d612515565b602090810292909201356000818152600a909352604090922054919250506001600160a01b031633146116525760405162461bcd60e51b815260040161078b9061252b565b6012546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061168690309033908690600401612556565b600060405180830381600087803b1580156116a057600080fd5b505af11580156116b4573d6000803e3d6000fd5b505050506116c181611d41565b6116cb9084612590565b336000908152600b602052604090209093506116e79082611d8e565b6000908152600a6020526040902080546001600160a01b03191690558061170d816125a8565b9150506115f1565b336000908152600b602090815260408083208054825181850281018501909352808352849383018282801561176957602002820191906000526020600020905b815481526020019060010190808311611755575b5050505050905060005b81518110156117df57600082828151811061179057611790612515565b602002602001015190506117af838381518110610e1057610e10612515565b6117b99085612590565b6000918252600960205260409091204290559250806117d7816125a8565b915050611773565b50336000908152600e602090815260408083208054825181850281018501909352808352919290919083018282801561183757602002820191906000526020600020905b815481526020019060010190808311611823575b5050505050905060005b81518110156118ad57600082828151811061185e5761185e612515565b6020026020010151905061187d838381518110610ec457610ec4612515565b6118879086612590565b6000918252600c60205260409091204290559350806118a5816125a8565b915050611841565b503360009081526011602090815260408083208054825181850281018501909352808352919290919083018282801561190557602002820191906000526020600020905b8154815260200190600101908083116118f1575b5050505050905060005b815181101561197b57600082828151811061192c5761192c612515565b6020026020010151905061194b838381518110610f7857610f78612515565b6119559087612590565b6000918252600f6020526040909120429055945080611973816125a8565b91505061190f565b50600061198760025490565b61199c906aa56fa5b99019a5c80000006125c3565b90506119af3382871161088b5786611e4d565b5050505050565b6005546001600160a01b031633146119e05760405162461bcd60e51b815260040161078b90612629565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600e60209081526040918290208054835181840281018401909452808452606093928301828280156112e857602002820191906000526020600020908154815260200190600101908083116112d45750505050509050919050565b600854600160a01b900460ff16611a955760405162461bcd60e51b815260040161078b90612607565b60005b81811015611103576000838383818110611ab457611ab4612515565b6014546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd9150611af590339030908690600401612556565b600060405180830381600087803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b5050336000818152601160209081526040808320805460018101825590845282842001879055958252600f8152858220429055601090529390932080546001600160a01b03191690931790925550819050611b7d816125a8565b915050611a98565b6005546001600160a01b03163314611baf5760405162461bcd60e51b815260040161078b90612629565b6001600160a01b038116611c145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078b565b61115d8161228a565b6001600160a01b038316611c7f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161078b565b6001600160a01b038216611ce05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161078b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000818152600960205260408120546201518090600a90611d6290426125c3565b611d6c919061265e565b611d76919061267d565b611d8890670de0b6b3a764000061265e565b92915050565b815460005b818110156108915782848281548110611dae57611dae612515565b90600052602060002001541415611e3b5781611dc9816125f0565b92505081811015611e1057838281548110611de657611de6612515565b9060005260206000200154848281548110611e0357611e03612515565b6000918252602090912001555b83805480611e2057611e206125da565b60019003818190600052602060002001600090559055610891565b80611e45816125a8565b915050611d93565b6001600160a01b038216611ea35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161078b565b8060026000828254611eb59190612590565b90915550506001600160a01b03821660009081526020819052604081208054839290611ee2908490612590565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316611f905760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161078b565b6001600160a01b038216611ff25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161078b565b6001600160a01b0383166000908152602081905260409020548181101561206a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161078b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906120a1908490612590565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ed91815260200190565b60405180910390a3610891565b6000818152600c60205260408120546201518090600590611d6290426125c3565b6000818152600f60205260408120546201518090601190611d6290426125c3565b6001600160a01b03821661219c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161078b565b6001600160a01b038216600090815260208190526040902054818110156122105760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161078b565b6001600160a01b038316600090815260208190526040812083830390556002805484929061223f9084906125c3565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b81811015612309578581018301518582016040015282016122ed565b8181111561231b576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561234357600080fd5b5035919050565b80356001600160a01b038116811461236157600080fd5b919050565b6000806040838503121561237957600080fd5b6123828361234a565b946020939093013593505050565b6000602082840312156123a257600080fd5b6123ab8261234a565b9392505050565b600080602083850312156123c557600080fd5b823567ffffffffffffffff808211156123dd57600080fd5b818501915085601f8301126123f157600080fd5b81358181111561240057600080fd5b8660208260051b850101111561241557600080fd5b60209290920196919550909350505050565b60008060006060848603121561243c57600080fd5b6124458461234a565b92506124536020850161234a565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561249b5783518352928401929184019160010161247f565b50909695505050505050565b600080604083850312156124ba57600080fd5b6124c38361234a565b91506124d16020840161234a565b90509250929050565b600181811c908216806124ee57607f821691505b6020821081141561250f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252601190820152702722a2a229afaa27afa122afa7aba722a960791b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125a3576125a361257a565b500190565b60006000198214156125bc576125bc61257a565b5060010190565b6000828210156125d5576125d561257a565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816125ff576125ff61257a565b506000190190565b6020808252600890820152674e4f545f4c49564560c01b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008160001904831182151516156126785761267861257a565b500290565b60008261269a57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220810cf9031f543feb840037cf829192b0cf6558ea0560945edb876347f1af14df64736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061027f5760003560e01c8063715018a61161015c578063bb93a4e6116100ce578063dd62ed3e11610087578063dd62ed3e146105e6578063e6923cf81461061f578063ecce866514610632578063ed56690014610645578063f2031a9914610658578063f2fde38b1461066b57600080fd5b8063bb93a4e61461057f578063c3b334c0146105a8578063c80d491b146105bb578063c9ecc9dd146105ce578063d1058e59146105d6578063d25d5a7b146105de57600080fd5b806395d89b411161012057806395d89b41146105185780639dc29fac14610520578063a05287c314610533578063a457c2d714610546578063a9059cbb14610559578063b3fb20cf1461056c57600080fd5b8063715018a6146104af578063774464f5146104b757806379cc6790146104e05780638da5cb5b146104f3578063957aa58c1461050457600080fd5b8063363da4c9116101f557806342966c68116101b957806342966c681461040457806349a2f1f2146104175780634a2ba8e71461042a5780634da6a5561461044a57806358620c3a1461047357806370a082311461048657600080fd5b8063363da4c9146103a557806339509351146103ce5780633bedb844146103e157806340a3d246146103f457806340bfa012146103fc57600080fd5b80632203cf45116102475780632203cf451461034157806323b872dd14610356578063313ce5671461036957806332cb6b0c1461037857806335322f371461038a578063362a3fad1461039257600080fd5b806306fdde0314610284578063093a2455146102a2578063095ea7b3146102e357806318160ddd146103065780631d3a53c014610318575b600080fd5b61028c61067e565b60405161029991906122dc565b60405180910390f35b6102cb6102b0366004612331565b6000908152601060205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610299565b6102f66102f1366004612366565b610710565b6040519015158152602001610299565b6002545b604051908152602001610299565b61030a610326366004612390565b6001600160a01b03166000908152600e602052604090205490565b61035461034f3660046123b2565b610726565b005b6102f6610364366004612427565b610897565b60405160128152602001610299565b61030a6aa56fa5b99019a5c800000081565b610354610941565b61030a6103a0366004612390565b610d86565b6102cb6103b3366004612331565b6000908152600a60205260409020546001600160a01b031690565b6102f66103dc366004612366565b610fae565b6103546103ef3660046123b2565b610fea565b610354611108565b61030a600a81565b610354610412366004612331565b611153565b6103546104253660046123b2565b611160565b61043d610438366004612390565b611288565b6040516102999190612463565b61030a610458366004612390565b6001600160a01b03166000908152600b602052604090205490565b6006546102cb906001600160a01b031681565b61030a610494366004612390565b6001600160a01b031660009081526020819052604090205490565b6103546112f4565b6102cb6104c5366004612331565b6000908152600d60205260409020546001600160a01b031690565b6103546104ee366004612366565b61132a565b6005546001600160a01b03166102cb565b6008546102f690600160a01b900460ff1681565b61028c6113ab565b61035461052e366004612366565b6113ba565b6103546105413660046123b2565b6113c4565b6102f6610554366004612366565b6114dd565b6102f6610567366004612366565b611576565b61043d61057a366004612390565b611583565b61030a61058d366004612390565b6001600160a01b031660009081526011602052604090205490565b6103546105b63660046123b2565b6115ed565b6008546102cb906001600160a01b031681565b61030a601181565b610354611715565b61030a600581565b61030a6105f43660046124a7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6007546102cb906001600160a01b031681565b610354610640366004612390565b6119b6565b61043d610653366004612390565b611a02565b6103546106663660046123b2565b611a6c565b610354610679366004612390565b611b85565b60606003805461068d906124da565b80601f01602080910402602001604051908101604052809291908181526020018280546106b9906124da565b80156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b5050505050905090565b600061071d338484611c1d565b50600192915050565b6000805b8281101561085757600084848381811061074657610746612515565b602090810292909201356000818152600d909352604090922054919250506001600160a01b031633146107945760405162461bcd60e51b815260040161078b9061252b565b60405180910390fd5b6013546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906107c890309033908690600401612556565b600060405180830381600087803b1580156107e257600080fd5b505af11580156107f6573d6000803e3d6000fd5b5050505061080381611d41565b61080d9084612590565b336000908152600e602052604090209093506108299082611d8e565b6000908152600d6020526040902080546001600160a01b03191690558061084f816125a8565b91505061072a565b50600061086360025490565b610878906aa56fa5b99019a5c80000006125c3565b90506108913382841161088b5783611e4d565b82611e4d565b50505050565b60006108a4848484611f2c565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156109295760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161078b565b6109368533858403611c1d565b506001949350505050565b336000908152600b6020526040812054118061096a5750336000908152600e6020526040812054115b80610982575033600090815260116020526040812054115b6109bc5760405162461bcd60e51b815260206004820152600b60248201526a139bdb994814dd185ad95960aa1b604482015260640161078b565b336000908152600b60205260408120545b8015610aec57336000908152600b602052604081206109ed6001846125c3565b815481106109fd576109fd612515565b6000918252602090912001546012546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610a3e90309033908690600401612556565b600060405180830381600087803b158015610a5857600080fd5b505af1158015610a6c573d6000803e3d6000fd5b50505050610a7981611d41565b610a839084612590565b336000908152600b6020526040902080549194509080610aa557610aa56125da565b600082815260208082208301600019908101839055909201909255918152600a9091526040902080546001600160a01b031916905580610ae4816125f0565b9150506109cd565b50336000908152600e60205260409020545b8015610c1d57336000908152600e60205260408120610b1e6001846125c3565b81548110610b2e57610b2e612515565b6000918252602090912001546013546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610b6f90309033908690600401612556565b600060405180830381600087803b158015610b8957600080fd5b505af1158015610b9d573d6000803e3d6000fd5b50505050610baa816120fa565b610bb49084612590565b336000908152600e6020526040902080549194509080610bd657610bd66125da565b600082815260208082208301600019908101839055909201909255918152600d9091526040902080546001600160a01b031916905580610c15816125f0565b915050610afe565b50336000908152601160205260409020545b8015610d4e57336000908152601160205260408120610c4f6001846125c3565b81548110610c5f57610c5f612515565b6000918252602090912001546014546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610ca090309033908690600401612556565b600060405180830381600087803b158015610cba57600080fd5b505af1158015610cce573d6000803e3d6000fd5b50505050610cdb8161211b565b610ce59084612590565b33600090815260116020526040902080549194509080610d0757610d076125da565b60008281526020808220830160001990810183905590920190925591815260109091526040902080546001600160a01b031916905580610d46816125f0565b915050610c2f565b506000610d5a60025490565b610d6f906aa56fa5b99019a5c80000006125c3565b9050610d823382841161088b5783611e4d565b5050565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835284938493929190830182828015610de857602002820191906000526020600020905b815481526020019060010190808311610dd4575b5050505050905060005b8151811015610e3b57610e1d828281518110610e1057610e10612515565b6020026020010151611d41565b610e279084612590565b925080610e33816125a8565b915050610df2565b506001600160a01b0384166000908152600e6020908152604080832080548251818502810185019093528083529192909190830182828015610e9c57602002820191906000526020600020905b815481526020019060010190808311610e88575b5050505050905060005b8151811015610eef57610ed1828281518110610ec457610ec4612515565b60200260200101516120fa565b610edb9085612590565b935080610ee7816125a8565b915050610ea6565b506001600160a01b038516600090815260116020908152604080832080548251818502810185019093528083529192909190830182828015610f5057602002820191906000526020600020905b815481526020019060010190808311610f3c575b5050505050905060005b8151811015610fa357610f85828281518110610f7857610f78612515565b602002602001015161211b565b610f8f9086612590565b945080610f9b816125a8565b915050610f5a565b509295945050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161071d918590610fe5908690612590565b611c1d565b600854600160a01b900460ff166110135760405162461bcd60e51b815260040161078b90612607565b60005b8181101561110357600083838381811061103257611032612515565b6012546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd915061107390339030908690600401612556565b600060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b5050336000818152600b6020908152604080832080546001810182559084528284200187905595825260098152858220429055600a90529390932080546001600160a01b031916909317909255508190506110fb816125a8565b915050611016565b505050565b6005546001600160a01b031633146111325760405162461bcd60e51b815260040161078b90612629565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b61115d338261213c565b50565b6000805b8281101561085757600084848381811061118057611180612515565b6020908102929092013560008181526010909352604090922054919250506001600160a01b031633146111c55760405162461bcd60e51b815260040161078b9061252b565b6014546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906111f990309033908690600401612556565b600060405180830381600087803b15801561121357600080fd5b505af1158015611227573d6000803e3d6000fd5b5050505061123481611d41565b61123e9084612590565b33600090815260116020526040902090935061125a9082611d8e565b600090815260106020526040902080546001600160a01b031916905580611280816125a8565b915050611164565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156112e857602002820191906000526020600020905b8154815260200190600101908083116112d4575b50505050509050919050565b6005546001600160a01b0316331461131e5760405162461bcd60e51b815260040161078b90612629565b611328600061228a565b565b600061133683336105f4565b9050818110156113945760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161078b565b6113a18333848403611c1d565b611103838361213c565b60606004805461068d906124da565b610d82828261213c565b600854600160a01b900460ff166113ed5760405162461bcd60e51b815260040161078b90612607565b60005b8181101561110357600083838381811061140c5761140c612515565b6013546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd915061144d90339030908690600401612556565b600060405180830381600087803b15801561146757600080fd5b505af115801561147b573d6000803e3d6000fd5b5050336000818152600e60209081526040808320805460018101825590845282842001879055958252600c8152858220429055600d90529390932080546001600160a01b031916909317909255508190506114d5816125a8565b9150506113f0565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561155f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161078b565b61156c3385858403611c1d565b5060019392505050565b600061071d338484611f2c565b6001600160a01b0381166000908152601160209081526040918290208054835181840281018401909452808452606093928301828280156112e857602002820191906000526020600020908154815260200190600101908083116112d45750505050509050919050565b6000805b8281101561085757600084848381811061160d5761160d612515565b602090810292909201356000818152600a909352604090922054919250506001600160a01b031633146116525760405162461bcd60e51b815260040161078b9061252b565b6012546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061168690309033908690600401612556565b600060405180830381600087803b1580156116a057600080fd5b505af11580156116b4573d6000803e3d6000fd5b505050506116c181611d41565b6116cb9084612590565b336000908152600b602052604090209093506116e79082611d8e565b6000908152600a6020526040902080546001600160a01b03191690558061170d816125a8565b9150506115f1565b336000908152600b602090815260408083208054825181850281018501909352808352849383018282801561176957602002820191906000526020600020905b815481526020019060010190808311611755575b5050505050905060005b81518110156117df57600082828151811061179057611790612515565b602002602001015190506117af838381518110610e1057610e10612515565b6117b99085612590565b6000918252600960205260409091204290559250806117d7816125a8565b915050611773565b50336000908152600e602090815260408083208054825181850281018501909352808352919290919083018282801561183757602002820191906000526020600020905b815481526020019060010190808311611823575b5050505050905060005b81518110156118ad57600082828151811061185e5761185e612515565b6020026020010151905061187d838381518110610ec457610ec4612515565b6118879086612590565b6000918252600c60205260409091204290559350806118a5816125a8565b915050611841565b503360009081526011602090815260408083208054825181850281018501909352808352919290919083018282801561190557602002820191906000526020600020905b8154815260200190600101908083116118f1575b5050505050905060005b815181101561197b57600082828151811061192c5761192c612515565b6020026020010151905061194b838381518110610f7857610f78612515565b6119559087612590565b6000918252600f6020526040909120429055945080611973816125a8565b91505061190f565b50600061198760025490565b61199c906aa56fa5b99019a5c80000006125c3565b90506119af3382871161088b5786611e4d565b5050505050565b6005546001600160a01b031633146119e05760405162461bcd60e51b815260040161078b90612629565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600e60209081526040918290208054835181840281018401909452808452606093928301828280156112e857602002820191906000526020600020908154815260200190600101908083116112d45750505050509050919050565b600854600160a01b900460ff16611a955760405162461bcd60e51b815260040161078b90612607565b60005b81811015611103576000838383818110611ab457611ab4612515565b6014546040516323b872dd60e01b81526020909202939093013593506001600160a01b03909216916323b872dd9150611af590339030908690600401612556565b600060405180830381600087803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b5050336000818152601160209081526040808320805460018101825590845282842001879055958252600f8152858220429055601090529390932080546001600160a01b03191690931790925550819050611b7d816125a8565b915050611a98565b6005546001600160a01b03163314611baf5760405162461bcd60e51b815260040161078b90612629565b6001600160a01b038116611c145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078b565b61115d8161228a565b6001600160a01b038316611c7f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161078b565b6001600160a01b038216611ce05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161078b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000818152600960205260408120546201518090600a90611d6290426125c3565b611d6c919061265e565b611d76919061267d565b611d8890670de0b6b3a764000061265e565b92915050565b815460005b818110156108915782848281548110611dae57611dae612515565b90600052602060002001541415611e3b5781611dc9816125f0565b92505081811015611e1057838281548110611de657611de6612515565b9060005260206000200154848281548110611e0357611e03612515565b6000918252602090912001555b83805480611e2057611e206125da565b60019003818190600052602060002001600090559055610891565b80611e45816125a8565b915050611d93565b6001600160a01b038216611ea35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161078b565b8060026000828254611eb59190612590565b90915550506001600160a01b03821660009081526020819052604081208054839290611ee2908490612590565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038316611f905760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161078b565b6001600160a01b038216611ff25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161078b565b6001600160a01b0383166000908152602081905260409020548181101561206a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161078b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906120a1908490612590565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ed91815260200190565b60405180910390a3610891565b6000818152600c60205260408120546201518090600590611d6290426125c3565b6000818152600f60205260408120546201518090601190611d6290426125c3565b6001600160a01b03821661219c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161078b565b6001600160a01b038216600090815260208190526040902054818110156122105760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161078b565b6001600160a01b038316600090815260208190526040812083830390556002805484929061223f9084906125c3565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b81811015612309578581018301518582016040015282016122ed565b8181111561231b576000604083870101525b50601f01601f1916929092016040019392505050565b60006020828403121561234357600080fd5b5035919050565b80356001600160a01b038116811461236157600080fd5b919050565b6000806040838503121561237957600080fd5b6123828361234a565b946020939093013593505050565b6000602082840312156123a257600080fd5b6123ab8261234a565b9392505050565b600080602083850312156123c557600080fd5b823567ffffffffffffffff808211156123dd57600080fd5b818501915085601f8301126123f157600080fd5b81358181111561240057600080fd5b8660208260051b850101111561241557600080fd5b60209290920196919550909350505050565b60008060006060848603121561243c57600080fd5b6124458461234a565b92506124536020850161234a565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561249b5783518352928401929184019160010161247f565b50909695505050505050565b600080604083850312156124ba57600080fd5b6124c38361234a565b91506124d16020840161234a565b90509250929050565b600181811c908216806124ee57607f821691505b6020821081141561250f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252601190820152702722a2a229afaa27afa122afa7aba722a960791b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125a3576125a361257a565b500190565b60006000198214156125bc576125bc61257a565b5060010190565b6000828210156125d5576125d561257a565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816125ff576125ff61257a565b506000190190565b6020808252600890820152674e4f545f4c49564560c01b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008160001904831182151516156126785761267861257a565b500290565b60008261269a57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220810cf9031f543feb840037cf829192b0cf6558ea0560945edb876347f1af14df64736f6c634300080b0033

Deployed Bytecode Sourcemap

20317:10675:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8719:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22934:117;;;;;;:::i;:::-;22996:7;23023:20;;;:11;:20;;;;;;-1:-1:-1;;;;;23023:20:0;;22934:117;;;;-1:-1:-1;;;;;965:32:1;;;947:51;;935:2;920:18;22934:117:0;801:203:1;10886:169:0;;;;;;:::i;:::-;;:::i;:::-;;;1611:14:1;;1604:22;1586:41;;1574:2;1559:18;10886:169:0;1446:187:1;9839:108:0;9927:12;;9839:108;;;1784:25:1;;;1772:2;1757:18;9839:108:0;1638:177:1;22383:136:0;;;;;;:::i;:::-;-1:-1:-1;;;;;22480:24:0;22453:7;22480:24;;;:16;:24;;;;;:31;;22383:136;25323:679;;;;;;:::i;:::-;;:::i;:::-;;11537:492;;;;;;:::i;:::-;;:::i;9681:93::-;;;9764:2;3106:36:1;;3094:2;3079:18;9681:93:0;2964:184:1;20371:56:0;;20408:19;20371:56;;27100:1457;;;:::i;23059:741::-;;;;;;:::i;:::-;;:::i;22116:115::-;;;;;;:::i;:::-;22177:7;22204:19;;;:10;:19;;;;;;-1:-1:-1;;;;;22204:19:0;;22116:115;12438:215;;;;;;:::i;:::-;;:::i;23808:406::-;;;;;;:::i;:::-;;:::i;29914:68::-;;;:::i;20503:47::-;;20548:2;20503:47;;19171:91;;;;;;:::i;:::-;;:::i;26429:663::-;;;;;;:::i;:::-;;:::i;21848:124::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21984:::-;;;;;;:::i;:::-;-1:-1:-1;;;;;22073:20:0;22046:7;22073:20;;;:12;:20;;;;;:27;;21984:124;20641:72;;;;;-1:-1:-1;;;;;20641:72:0;;;10010:127;;;;;;:::i;:::-;-1:-1:-1;;;;;10111:18:0;10084:7;10111:18;;;;;;;;;;;;10010:127;2523:94;;;:::i;22527:123::-;;;;;;:::i;:::-;22592:7;22619:23;;;:14;:23;;;;;;-1:-1:-1;;;;;22619:23:0;;22527:123;19581:368;;;;;;:::i;:::-;;:::i;1872:87::-;1945:6;;-1:-1:-1;;;;;1945:6:0;1872:87;;20884:24;;;;;-1:-1:-1;;;20884:24:0;;;;;;8938:104;;;:::i;29688:91::-;;;;;;:::i;:::-;;:::i;24888:427::-;;;;;;:::i;:::-;;:::i;13156:413::-;;;;;;:::i;:::-;;:::i;10350:175::-;;;;;;:::i;:::-;;:::i;22658:126::-;;;;;;:::i;:::-;;:::i;22796:130::-;;;;;;:::i;:::-;-1:-1:-1;;;;;22890:21:0;22863:7;22890:21;;;:13;:21;;;;;:28;;22796:130;24222:658;;;;;;:::i;:::-;;:::i;20804:73::-;;;;;-1:-1:-1;;;;;20804:73:0;;;20434:48;;20480:2;20434:48;;28565:1113;;;:::i;20571:50::-;;20620:1;20571:50;;10588:151;;;;;;:::i;:::-;-1:-1:-1;;;;;10704:18:0;;;10677:7;10704:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10588:151;20721:76;;;;;-1:-1:-1;;;;;20721:76:0;;;29787:115;;;;;;:::i;:::-;;:::i;22239:132::-;;;;;;:::i;:::-;;:::i;26010:411::-;;;;;;:::i;:::-;;:::i;2772:192::-;;;;;;:::i;:::-;;:::i;8719:100::-;8773:13;8806:5;8799:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8719:100;:::o;10886:169::-;10969:4;10986:39;740:10;11009:7;11018:6;10986:8;:39::i;:::-;-1:-1:-1;11043:4:0;10886:169;;;;:::o;25323:679::-;25403:20;25445:9;25440:415;25460:19;;;25440:415;;;25501:10;25514:8;;25523:1;25514:11;;;;;;;:::i;:::-;;;;;;;;;;25548:18;;;;:14;:18;;;;;;;;25514:11;;-1:-1:-1;;;;;;;25548:18:0;25570:10;25548:32;25540:62;;;;-1:-1:-1;;;25540:62:0;;;;;;;:::i;:::-;;;;;;;;;25619:17;;:61;;-1:-1:-1;;;25619:61:0;;-1:-1:-1;;;;;25619:17:0;;;;:30;;:61;;25658:4;;25665:10;;25677:2;;25619:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25711:13;25721:2;25711:9;:13::i;:::-;25695:29;;;;:::i;:::-;25781:10;25764:28;;;;:16;:28;;;;;25695:29;;-1:-1:-1;25741:56:0;;25794:2;25741:22;:56::i;:::-;25841:1;25812:18;;;:14;:18;;;;;:31;;-1:-1:-1;;;;;;25812:31:0;;;25481:3;;;;:::i;:::-;;;;25440:415;;;;25867:17;25900:13;9927:12;;;9839:108;25900:13;25887:26;;20408:19;25887:26;:::i;:::-;25867:46;;25924:70;25930:10;25957:9;25942:12;:24;:51;;25981:12;25924:5;:70::i;25942:51::-;25969:9;25924:5;:70::i;:::-;25392:610;;25323:679;;:::o;11537:492::-;11677:4;11694:36;11704:6;11712:9;11723:6;11694:9;:36::i;:::-;-1:-1:-1;;;;;11770:19:0;;11743:24;11770:19;;;:11;:19;;;;;;;;740:10;11770:33;;;;;;;;11822:26;;;;11814:79;;;;-1:-1:-1;;;11814:79:0;;6035:2:1;11814:79:0;;;6017:21:1;6074:2;6054:18;;;6047:30;6113:34;6093:18;;;6086:62;-1:-1:-1;;;6164:18:1;;;6157:38;6212:19;;11814:79:0;5833:404:1;11814:79:0;11929:57;11938:6;740:10;11979:6;11960:16;:25;11929:8;:57::i;:::-;-1:-1:-1;12017:4:0;;11537:492;-1:-1:-1;;;;11537:492:0:o;27100:1457::-;27166:10;27180:1;22073:20;;;:12;:20;;;;;:27;27150:31;:74;;;-1:-1:-1;27209:10:0;27223:1;22480:24;;;:16;:24;;;;;:31;27185:39;27150:74;:114;;;-1:-1:-1;27249:10:0;27263:1;22890:21;;;:13;:21;;;;;:28;27228:36;27150:114;27142:138;;;;-1:-1:-1;;;27142:138:0;;6444:2:1;27142:138:0;;;6426:21:1;6483:2;6463:18;;;6456:30;-1:-1:-1;;;6502:18:1;;;6495:41;6553:18;;27142:138:0;6242:335:1;27142:138:0;27358:10;27291:20;27345:24;;;:12;:24;;;;;:31;27328:340;27378:5;;27328:340;;27431:10;27405;27418:24;;;:12;:24;;;;;27443:5;27447:1;27443;:5;:::i;:::-;27418:31;;;;;;;;:::i;:::-;;;;;;;;;;;27466:13;;:57;;-1:-1:-1;;;27466:57:0;;27418:31;;-1:-1:-1;;;;;;27466:13:0;;:26;;:57;;27501:4;;27508:10;;27418:31;;27466:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27554:13;27564:2;27554:9;:13::i;:::-;27538:29;;;;:::i;:::-;27597:10;27584:24;;;;:12;:24;;;;;:30;;27538:29;;-1:-1:-1;27584:24:0;:30;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;27584:30:0;;;;;;;;;;;;27629:14;;;:10;:14;;;;;;:27;;-1:-1:-1;;;;;;27629:27:0;;;27385:3;;;;:::i;:::-;;;;27328:340;;;-1:-1:-1;27714:10:0;27685:9;27697:28;;;:16;:28;;;;;:35;27680:368;27734:5;;27680:368;;27791:10;27761;27774:28;;;:16;:28;;;;;27803:5;27807:1;27803;:5;:::i;:::-;27774:35;;;;;;;;:::i;:::-;;;;;;;;;;;27826:17;;:61;;-1:-1:-1;;;27826:61:0;;27774:35;;-1:-1:-1;;;;;;27826:17:0;;:30;;:61;;27865:4;;27872:10;;27774:35;;27826:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27918:21;27936:2;27918:17;:21::i;:::-;27902:37;;;;:::i;:::-;27973:10;27956:28;;;;:16;:28;;;;;:34;;27902:37;;-1:-1:-1;27956:28:0;:34;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;27956:34:0;;;;;;;;;;;;28005:18;;;:14;:18;;;;;;:31;;-1:-1:-1;;;;;;28005:31:0;;;27741:3;;;;:::i;:::-;;;;27680:368;;;-1:-1:-1;28091:10:0;28065:9;28077:25;;;:13;:25;;;;;:32;28060:350;28111:5;;28060:350;;28165:10;28138;28151:25;;;:13;:25;;;;;28177:5;28181:1;28177;:5;:::i;:::-;28151:32;;;;;;;;:::i;:::-;;;;;;;;;;;28200:14;;:58;;-1:-1:-1;;;28200:58:0;;28151:32;;-1:-1:-1;;;;;;28200:14:0;;:27;;:58;;28236:4;;28243:10;;28151:32;;28200:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28289:18;28304:2;28289:14;:18::i;:::-;28273:34;;;;:::i;:::-;28338:10;28324:25;;;;:13;:25;;;;;:31;;28273:34;;-1:-1:-1;28324:25:0;:31;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;28324:31:0;;;;;;;;;;;;28370:15;;;:11;:15;;;;;;:28;;-1:-1:-1;;;;;;28370:28:0;;;28118:3;;;;:::i;:::-;;;;28060:350;;;;28422:17;28455:13;9927:12;;;9839:108;28455:13;28442:26;;20408:19;28442:26;:::i;:::-;28422:46;;28479:70;28485:10;28512:9;28497:12;:24;:51;;28536:12;25924:5;:70::i;28479:::-;27131:1426;;27100:1457::o;23059:741::-;-1:-1:-1;;;;;23206:20:0;;23119:7;23206:20;;;:12;:20;;;;;;;;23176:50;;;;;;;;;;;;;;;;;23119:7;;;;23176:50;23206:20;23176:50;;;23206:20;23176:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23242:9;23237:115;23261:10;:17;23257:1;:21;23237:115;;;23316:24;23326:10;23337:1;23326:13;;;;;;;;:::i;:::-;;;;;;;23316:9;:24::i;:::-;23300:40;;;;:::i;:::-;;-1:-1:-1;23280:3:0;;;;:::i;:::-;;;;23237:115;;;-1:-1:-1;;;;;;23398:24:0;;23364:31;23398:24;;;:16;:24;;;;;;;;23364:58;;;;;;;;;;;;;;;;;;;23398:24;;23364:58;;;23398:24;23364:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23438:9;23433:131;23457:14;:21;23453:1;:25;23433:131;;;23516:36;23534:14;23549:1;23534:17;;;;;;;;:::i;:::-;;;;;;;23516;:36::i;:::-;23500:52;;;;:::i;:::-;;-1:-1:-1;23480:3:0;;;;:::i;:::-;;;;23433:131;;;-1:-1:-1;;;;;;23607:21:0;;23576:28;23607:21;;;:13;:21;;;;;;;;23576:52;;;;;;;;;;;;;;;;;;;23607:21;;23576:52;;;23607:21;23576:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23644:9;23639:122;23663:11;:18;23659:1;:22;23639:122;;;23719:30;23734:11;23746:1;23734:14;;;;;;;;:::i;:::-;;;;;;;23719;:30::i;:::-;23703:46;;;;:::i;:::-;;-1:-1:-1;23683:3:0;;;;:::i;:::-;;;;23639:122;;;-1:-1:-1;23780:12:0;;23059:741;-1:-1:-1;;;;;23059:741:0:o;12438:215::-;740:10;12526:4;12575:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12575:34:0;;;;;;;;;;12526:4;;12543:80;;12566:7;;12575:47;;12612:10;;12575:47;:::i;:::-;12543:8;:80::i;23808:406::-;21803:4;;-1:-1:-1;;;21803:4:0;;;;21795:25;;;;-1:-1:-1;;;21795:25:0;;;;;;;:::i;:::-;23900:9:::1;23895:312;23915:19:::0;;::::1;23895:312;;;23956:10;23969:8;;23978:1;23969:11;;;;;;;:::i;:::-;23995:13;::::0;:57:::1;::::0;-1:-1:-1;;;23995:57:0;;23969:11:::1;::::0;;::::1;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;23995:13:0;;::::1;::::0;:26:::1;::::0;-1:-1:-1;23995:57:0::1;::::0;24022:10:::1;::::0;24042:4:::1;::::0;23969:11;;23995:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;24082:10:0::1;24069:24;::::0;;;:12:::1;:24;::::0;;;;;;;:33;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;24117:18;;;:14:::1;:18:::0;;;;;24138:15:::1;24117:36:::0;;24168:10:::1;:14:::0;;;;;;:27;;-1:-1:-1;;;;;;24168:27:0::1;::::0;;::::1;::::0;;;-1:-1:-1;23936:3:0;;-1:-1:-1;23936:3:0::1;::::0;::::1;:::i;:::-;;;;23895:312;;;;23808:406:::0;;:::o;29914:68::-;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;29970:4:::1;::::0;;-1:-1:-1;;;;29962:12:0;::::1;-1:-1:-1::0;;;29970:4:0;;;::::1;;;29969:5;29962:12:::0;;::::1;;::::0;;29914:68::o;19171:91::-;19227:27;740:10;19247:6;19227:5;:27::i;:::-;19171:91;:::o;26429:663::-;26505:20;26547:9;26542:403;26562:19;;;26542:403;;;26603:10;26616:8;;26625:1;26616:11;;;;;;;:::i;:::-;;;;;;;;;;26650:15;;;;:11;:15;;;;;;;;26616:11;;-1:-1:-1;;;;;;;26650:15:0;26669:10;26650:29;26642:59;;;;-1:-1:-1;;;26642:59:0;;;;;;;:::i;:::-;26718:14;;:58;;-1:-1:-1;;;26718:58:0;;-1:-1:-1;;;;;26718:14:0;;;;:27;;:58;;26754:4;;26761:10;;26773:2;;26718:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26807:13;26817:2;26807:9;:13::i;:::-;26791:29;;;;:::i;:::-;26874:10;26860:25;;;;:13;:25;;;;;26791:29;;-1:-1:-1;26837:53:0;;26887:2;26837:22;:53::i;:::-;26931:1;26905:15;;;:11;:15;;;;;:28;;-1:-1:-1;;;;;;26905:28:0;;;26583:3;;;;:::i;:::-;;;;26542:403;;21848:124;-1:-1:-1;;;;;21944:20:0;;;;;;:12;:20;;;;;;;;;21937:27;;;;;;;;;;;;;;;;;21908:16;;21937:27;;;21944:20;21937:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21848:124;;;:::o;2523:94::-;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;2588:21:::1;2606:1;2588:9;:21::i;:::-;2523:94::o:0;19581:368::-;19658:24;19685:32;19695:7;740:10;10588:151;:::i;19685:32::-;19658:59;;19756:6;19736:16;:26;;19728:75;;;;-1:-1:-1;;;19728:75:0;;7754:2:1;19728:75:0;;;7736:21:1;7793:2;7773:18;;;7766:30;7832:34;7812:18;;;7805:62;-1:-1:-1;;;7883:18:1;;;7876:34;7927:19;;19728:75:0;7552:400:1;19728:75:0;19839:58;19848:7;740:10;19890:6;19871:16;:25;19839:8;:58::i;:::-;19919:22;19925:7;19934:6;19919:5;:22::i;8938:104::-;8994:13;9027:7;9020:14;;;;;:::i;29688:91::-;29752:19;29758:4;29764:6;29752:5;:19::i;24888:427::-;21803:4;;-1:-1:-1;;;21803:4:0;;;;21795:25;;;;-1:-1:-1;;;21795:25:0;;;;;;;:::i;:::-;24985:9:::1;24980:328;25000:19:::0;;::::1;24980:328;;;25041:10;25054:8;;25063:1;25054:11;;;;;;;:::i;:::-;25080:17;::::0;:61:::1;::::0;-1:-1:-1;;;25080:61:0;;25054:11:::1;::::0;;::::1;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;25080:17:0;;::::1;::::0;:30:::1;::::0;-1:-1:-1;25080:61:0::1;::::0;25111:10:::1;::::0;25131:4:::1;::::0;25054:11;;25080:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25175:10:0::1;25158:28;::::0;;;:16:::1;:28;::::0;;;;;;;:37;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;25210:22;;;:18:::1;:22:::0;;;;;25235:15:::1;25210:40:::0;;25265:14:::1;:18:::0;;;;;;:31;;-1:-1:-1;;;;;;25265:31:0::1;::::0;;::::1;::::0;;;-1:-1:-1;25021:3:0;;-1:-1:-1;25021:3:0::1;::::0;::::1;:::i;:::-;;;;24980:328;;13156:413:::0;740:10;13249:4;13293:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13293:34:0;;;;;;;;;;13346:35;;;;13338:85;;;;-1:-1:-1;;;13338:85:0;;8159:2:1;13338:85:0;;;8141:21:1;8198:2;8178:18;;;8171:30;8237:34;8217:18;;;8210:62;-1:-1:-1;;;8288:18:1;;;8281:35;8333:19;;13338:85:0;7957:401:1;13338:85:0;13459:67;740:10;13482:7;13510:15;13491:16;:34;13459:8;:67::i;:::-;-1:-1:-1;13557:4:0;;13156:413;-1:-1:-1;;;13156:413:0:o;10350:175::-;10436:4;10453:42;740:10;10477:9;10488:6;10453:9;:42::i;22658:126::-;-1:-1:-1;;;;;22755:21:0;;;;;;:13;:21;;;;;;;;;22748:28;;;;;;;;;;;;;;;;;22719:16;;22748:28;;;22755:21;22748:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22658:126;;;:::o;24222:658::-;24297:20;24339:9;24334:399;24354:19;;;24334:399;;;24395:10;24408:8;;24417:1;24408:11;;;;;;;:::i;:::-;;;;;;;;;;24442:14;;;;:10;:14;;;;;;;;24408:11;;-1:-1:-1;;;;;;;24442:14:0;24460:10;24442:28;24434:58;;;;-1:-1:-1;;;24434:58:0;;;;;;;:::i;:::-;24509:13;;:57;;-1:-1:-1;;;24509:57:0;;-1:-1:-1;;;;;24509:13:0;;;;:26;;:57;;24544:4;;24551:10;;24563:2;;24509:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24597:13;24607:2;24597:9;:13::i;:::-;24581:29;;;;:::i;:::-;24663:10;24650:24;;;;:12;:24;;;;;24581:29;;-1:-1:-1;24627:52:0;;24676:2;24627:22;:52::i;:::-;24719:1;24694:14;;;:10;:14;;;;;:27;;-1:-1:-1;;;;;;24694:27:0;;;24375:3;;;;:::i;:::-;;;;24334:399;;28565:1113;28685:10;28605:20;28672:24;;;:12;:24;;;;;;;;28642:54;;;;;;;;;;;;;;;;;28605:20;;28642:54;;28672:24;28642:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28712:9;28707:209;28731:10;:17;28727:1;:21;28707:209;;;28770:10;28783;28794:1;28783:13;;;;;;;;:::i;:::-;;;;;;;28770:26;;28829:24;28839:10;28850:1;28839:13;;;;;;;;:::i;28829:24::-;28813:40;;;;:::i;:::-;28868:18;;;;:14;:18;;;;;;28889:15;28868:36;;28813:40;-1:-1:-1;28750:3:0;;;;:::i;:::-;;;;28707:209;;;-1:-1:-1;28979:10:0;28928:31;28962:28;;;:16;:28;;;;;;;;28928:62;;;;;;;;;;;;;;;;;;;28962:28;;28928:62;;;28962:28;28928:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29006:9;29001:233;29025:14;:21;29021:1;:25;29001:233;;;29068:10;29081:14;29096:1;29081:17;;;;;;;;:::i;:::-;;;;;;;29068:30;;29131:36;29149:14;29164:1;29149:17;;;;;;;;:::i;29131:36::-;29115:52;;;;:::i;:::-;29182:22;;;;:18;:22;;;;;;29207:15;29182:40;;29115:52;-1:-1:-1;29048:3:0;;;;:::i;:::-;;;;29001:233;;;-1:-1:-1;29291:10:0;29246:28;29277:25;;;:13;:25;;;;;;;;29246:56;;;;;;;;;;;;;;;;;;;29277:25;;29246:56;;;29277:25;29246:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29318:9;29313:218;29337:11;:18;29333:1;:22;29313:218;;;29377:10;29390:11;29402:1;29390:14;;;;;;;;:::i;:::-;;;;;;;29377:27;;29437:30;29452:11;29464:1;29452:14;;;;;;;;:::i;29437:30::-;29421:46;;;;:::i;:::-;29482:19;;;;:15;:19;;;;;;29504:15;29482:37;;29421:46;-1:-1:-1;29357:3:0;;;;:::i;:::-;;;;29313:218;;;;29543:17;29576:13;9927:12;;;9839:108;29576:13;29563:26;;20408:19;29563:26;:::i;:::-;29543:46;;29600:70;29606:10;29633:9;29618:12;:24;:51;;29657:12;25924:5;:70::i;29600:::-;28594:1084;;;;;28565:1113::o;29787:115::-;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;29864:13:::1;:30:::0;;-1:-1:-1;;;;;;29864:30:0::1;-1:-1:-1::0;;;;;29864:30:0;;;::::1;::::0;;;::::1;::::0;;29787:115::o;22239:132::-;-1:-1:-1;;;;;22339:24:0;;;;;;:16;:24;;;;;;;;;22332:31;;;;;;;;;;;;;;;;;22303:16;;22332:31;;;22339:24;22332:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22239:132;;;:::o;26010:411::-;21803:4;;-1:-1:-1;;;21803:4:0;;;;21795:25;;;;-1:-1:-1;;;21795:25:0;;;;;;;:::i;:::-;26103:9:::1;26098:316;26118:19:::0;;::::1;26098:316;;;26159:10;26172:8;;26181:1;26172:11;;;;;;;:::i;:::-;26198:14;::::0;:58:::1;::::0;-1:-1:-1;;;26198:58:0;;26172:11:::1;::::0;;::::1;::::0;;;::::1;;::::0;-1:-1:-1;;;;;;26198:14:0;;::::1;::::0;:27:::1;::::0;-1:-1:-1;26198:58:0::1;::::0;26226:10:::1;::::0;26246:4:::1;::::0;26172:11;;26198:58:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26287:10:0::1;26273:25;::::0;;;:13:::1;:25;::::0;;;;;;;:34;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;26322:19;;;:15:::1;:19:::0;;;;;26344:15:::1;26322:37:::0;;26374:11:::1;:15:::0;;;;;;:28;;-1:-1:-1;;;;;;26374:28:0::1;::::0;;::::1;::::0;;;-1:-1:-1;26139:3:0;;-1:-1:-1;26139:3:0::1;::::0;::::1;:::i;:::-;;;;26098:316;;2772:192:::0;1945:6;;-1:-1:-1;;;;;1945:6:0;740:10;2092:23;2084:68;;;;-1:-1:-1;;;2084:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2861:22:0;::::1;2853:73;;;::::0;-1:-1:-1;;;2853:73:0;;8565:2:1;2853:73:0::1;::::0;::::1;8547:21:1::0;8604:2;8584:18;;;8577:30;8643:34;8623:18;;;8616:62;-1:-1:-1;;;8694:18:1;;;8687:36;8740:19;;2853:73:0::1;8363:402:1::0;2853:73:0::1;2937:19;2947:8;2937:9;:19::i;16840:380::-:0;-1:-1:-1;;;;;16976:19:0;;16968:68;;;;-1:-1:-1;;;16968:68:0;;8972:2:1;16968:68:0;;;8954:21:1;9011:2;8991:18;;;8984:30;9050:34;9030:18;;;9023:62;-1:-1:-1;;;9101:18:1;;;9094:34;9145:19;;16968:68:0;8770:400:1;16968:68:0;-1:-1:-1;;;;;17055:21:0;;17047:68;;;;-1:-1:-1;;;17047:68:0;;9377:2:1;17047:68:0;;;9359:21:1;9416:2;9396:18;;;9389:30;9455:34;9435:18;;;9428:62;-1:-1:-1;;;9506:18:1;;;9499:32;9548:19;;17047:68:0;9175:398:1;17047:68:0;-1:-1:-1;;;;;17128:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17180:32;;1784:25:1;;;17180:32:0;;1757:18:1;17180:32:0;;;;;;;16840:380;;;:::o;29990:175::-;30048:7;30094:23;;;:14;:23;;;;;;30142:5;;20548:2;;30076:41;;:15;:41;:::i;:::-;30075:64;;;;:::i;:::-;:72;;;;:::i;:::-;:82;;30150:7;30075:82;:::i;:::-;30068:89;29990:175;-1:-1:-1;;29990:175:0:o;30562:427::-;30673:12;;30656:14;30696:286;30720:6;30716:1;:10;30696:286;;;30764:7;30752:5;30758:1;30752:8;;;;;;;;:::i;:::-;;;;;;;;;:19;30748:223;;;30792:8;;;;:::i;:::-;;;;30827:6;30823:1;:10;30819:83;;;30869:5;30875:6;30869:13;;;;;;;;:::i;:::-;;;;;;;;;30858:5;30864:1;30858:8;;;;;;;;:::i;:::-;;;;;;;;;;:24;30819:83;30920:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30950:5;;30748:223;30728:3;;;;:::i;:::-;;;;30696:286;;15079:399;-1:-1:-1;;;;;15163:21:0;;15155:65;;;;-1:-1:-1;;;15155:65:0;;10175:2:1;15155:65:0;;;10157:21:1;10214:2;10194:18;;;10187:30;10253:33;10233:18;;;10226:61;10304:18;;15155:65:0;9973:355:1;15155:65:0;15311:6;15295:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15328:18:0;;:9;:18;;;;;;;;;;:28;;15350:6;;15328:9;:28;;15350:6;;15328:28;:::i;:::-;;;;-1:-1:-1;;15372:37:0;;1784:25:1;;;-1:-1:-1;;;;;15372:37:0;;;15389:1;;15372:37;;1772:2:1;1757:18;15372:37:0;;;;;;;27131:1426;;27100:1457::o;14059:733::-;-1:-1:-1;;;;;14199:20:0;;14191:70;;;;-1:-1:-1;;;14191:70:0;;10535:2:1;14191:70:0;;;10517:21:1;10574:2;10554:18;;;10547:30;10613:34;10593:18;;;10586:62;-1:-1:-1;;;10664:18:1;;;10657:35;10709:19;;14191:70:0;10333:401:1;14191:70:0;-1:-1:-1;;;;;14280:23:0;;14272:71;;;;-1:-1:-1;;;14272:71:0;;10941:2:1;14272:71:0;;;10923:21:1;10980:2;10960:18;;;10953:30;11019:34;10999:18;;;10992:62;-1:-1:-1;;;11070:18:1;;;11063:33;11113:19;;14272:71:0;10739:399:1;14272:71:0;-1:-1:-1;;;;;14440:17:0;;14416:21;14440:17;;;;;;;;;;;14476:23;;;;14468:74;;;;-1:-1:-1;;;14468:74:0;;11345:2:1;14468:74:0;;;11327:21:1;11384:2;11364:18;;;11357:30;11423:34;11403:18;;;11396:62;-1:-1:-1;;;11474:18:1;;;11467:36;11520:19;;14468:74:0;11143:402:1;14468:74:0;-1:-1:-1;;;;;14578:17:0;;;:9;:17;;;;;;;;;;;14598:22;;;14578:42;;14642:20;;;;;;;;:30;;14614:6;;14578:9;14642:30;;14614:6;;14642:30;:::i;:::-;;;;;;;;14707:9;-1:-1:-1;;;;;14690:35:0;14699:6;-1:-1:-1;;;;;14690:35:0;;14718:6;14690:35;;;;1784:25:1;;1772:2;1757:18;;1638:177;14690:35:0;;;;;;;;14738:46;23808:406;30173:191;30239:7;30285:27;;;:18;:27;;;;;;30341:5;;20620:1;;30267:45;;:15;:45;:::i;30372:182::-;30435:7;30481:24;;;:15;:24;;;;;;30531:5;;20480:2;;30463:42;;:15;:42;:::i;15811:591::-;-1:-1:-1;;;;;15895:21:0;;15887:67;;;;-1:-1:-1;;;15887:67:0;;11752:2:1;15887:67:0;;;11734:21:1;11791:2;11771:18;;;11764:30;11830:34;11810:18;;;11803:62;-1:-1:-1;;;11881:18:1;;;11874:31;11922:19;;15887:67:0;11550:397:1;15887:67:0;-1:-1:-1;;;;;16054:18:0;;16029:22;16054:18;;;;;;;;;;;16091:24;;;;16083:71;;;;-1:-1:-1;;;16083:71:0;;12154:2:1;16083:71:0;;;12136:21:1;12193:2;12173:18;;;12166:30;12232:34;12212:18;;;12205:62;-1:-1:-1;;;12283:18:1;;;12276:32;12325:19;;16083:71:0;11952:398:1;16083:71:0;-1:-1:-1;;;;;16190:18:0;;:9;:18;;;;;;;;;;16211:23;;;16190:44;;16256:12;:22;;16228:6;;16190:9;16256:22;;16228:6;;16256:22;:::i;:::-;;;;-1:-1:-1;;16296:37:0;;1784:25:1;;;16322:1:0;;-1:-1:-1;;;;;16296:37:0;;;;;1772:2:1;1757:18;16296:37:0;;;;;;;23895:312:::1;23808:406:::0;;:::o;2972:173::-;3047:6;;;-1:-1:-1;;;;;3064:17:0;;;-1:-1:-1;;;;;;3064:17:0;;;;;;;3097:40;;3047:6;;;3064:17;3047:6;;3097:40;;3028:16;;3097:40;3017:128;2972:173;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:180::-;675:6;728:2;716:9;707:7;703:23;699:32;696:52;;;744:1;741;734:12;696:52;-1:-1:-1;767:23:1;;616:180;-1:-1:-1;616:180:1:o;1009:173::-;1077:20;;-1:-1:-1;;;;;1126:31:1;;1116:42;;1106:70;;1172:1;1169;1162:12;1106:70;1009:173;;;:::o;1187:254::-;1255:6;1263;1316:2;1304:9;1295:7;1291:23;1287:32;1284:52;;;1332:1;1329;1322:12;1284:52;1355:29;1374:9;1355:29;:::i;:::-;1345:39;1431:2;1416:18;;;;1403:32;;-1:-1:-1;;;1187:254:1:o;1820:186::-;1879:6;1932:2;1920:9;1911:7;1907:23;1903:32;1900:52;;;1948:1;1945;1938:12;1900:52;1971:29;1990:9;1971:29;:::i;:::-;1961:39;1820:186;-1:-1:-1;;;1820:186:1:o;2011:615::-;2097:6;2105;2158:2;2146:9;2137:7;2133:23;2129:32;2126:52;;;2174:1;2171;2164:12;2126:52;2214:9;2201:23;2243:18;2284:2;2276:6;2273:14;2270:34;;;2300:1;2297;2290:12;2270:34;2338:6;2327:9;2323:22;2313:32;;2383:7;2376:4;2372:2;2368:13;2364:27;2354:55;;2405:1;2402;2395:12;2354:55;2445:2;2432:16;2471:2;2463:6;2460:14;2457:34;;;2487:1;2484;2477:12;2457:34;2540:7;2535:2;2525:6;2522:1;2518:14;2514:2;2510:23;2506:32;2503:45;2500:65;;;2561:1;2558;2551:12;2500:65;2592:2;2584:11;;;;;2614:6;;-1:-1:-1;2011:615:1;;-1:-1:-1;;;;2011:615:1:o;2631:328::-;2708:6;2716;2724;2777:2;2765:9;2756:7;2752:23;2748:32;2745:52;;;2793:1;2790;2783:12;2745:52;2816:29;2835:9;2816:29;:::i;:::-;2806:39;;2864:38;2898:2;2887:9;2883:18;2864:38;:::i;:::-;2854:48;;2949:2;2938:9;2934:18;2921:32;2911:42;;2631:328;;;;;:::o;3153:632::-;3324:2;3376:21;;;3446:13;;3349:18;;;3468:22;;;3295:4;;3324:2;3547:15;;;;3521:2;3506:18;;;3295:4;3590:169;3604:6;3601:1;3598:13;3590:169;;;3665:13;;3653:26;;3734:15;;;;3699:12;;;;3626:1;3619:9;3590:169;;;-1:-1:-1;3776:3:1;;3153:632;-1:-1:-1;;;;;;3153:632:1:o;3790:260::-;3858:6;3866;3919:2;3907:9;3898:7;3894:23;3890:32;3887:52;;;3935:1;3932;3925:12;3887:52;3958:29;3977:9;3958:29;:::i;:::-;3948:39;;4006:38;4040:2;4029:9;4025:18;4006:38;:::i;:::-;3996:48;;3790:260;;;;;:::o;4055:380::-;4134:1;4130:12;;;;4177;;;4198:61;;4252:4;4244:6;4240:17;4230:27;;4198:61;4305:2;4297:6;4294:14;4274:18;4271:38;4268:161;;;4351:10;4346:3;4342:20;4339:1;4332:31;4386:4;4383:1;4376:15;4414:4;4411:1;4404:15;4268:161;;4055:380;;;:::o;4440:127::-;4501:10;4496:3;4492:20;4489:1;4482:31;4532:4;4529:1;4522:15;4556:4;4553:1;4546:15;4572:341;4774:2;4756:21;;;4813:2;4793:18;;;4786:30;-1:-1:-1;;;4847:2:1;4832:18;;4825:47;4904:2;4889:18;;4572:341::o;4918:375::-;-1:-1:-1;;;;;5176:15:1;;;5158:34;;5228:15;;;;5223:2;5208:18;;5201:43;5275:2;5260:18;;5253:34;;;;5108:2;5093:18;;4918:375::o;5298:127::-;5359:10;5354:3;5350:20;5347:1;5340:31;5390:4;5387:1;5380:15;5414:4;5411:1;5404:15;5430:128;5470:3;5501:1;5497:6;5494:1;5491:13;5488:39;;;5507:18;;:::i;:::-;-1:-1:-1;5543:9:1;;5430:128::o;5563:135::-;5602:3;-1:-1:-1;;5623:17:1;;5620:43;;;5643:18;;:::i;:::-;-1:-1:-1;5690:1:1;5679:13;;5563:135::o;5703:125::-;5743:4;5771:1;5768;5765:8;5762:34;;;5776:18;;:::i;:::-;-1:-1:-1;5813:9:1;;5703:125::o;6582:127::-;6643:10;6638:3;6634:20;6631:1;6624:31;6674:4;6671:1;6664:15;6698:4;6695:1;6688:15;6714:136;6753:3;6781:5;6771:39;;6790:18;;:::i;:::-;-1:-1:-1;;;6826:18:1;;6714:136::o;6855:331::-;7057:2;7039:21;;;7096:1;7076:18;;;7069:29;-1:-1:-1;;;7129:2:1;7114:18;;7107:38;7177:2;7162:18;;6855:331::o;7191:356::-;7393:2;7375:21;;;7412:18;;;7405:30;7471:34;7466:2;7451:18;;7444:62;7538:2;7523:18;;7191:356::o;9578:168::-;9618:7;9684:1;9680;9676:6;9672:14;9669:1;9666:21;9661:1;9654:9;9647:17;9643:45;9640:71;;;9691:18;;:::i;:::-;-1:-1:-1;9731:9:1;;9578:168::o;9751:217::-;9791:1;9817;9807:132;;9861:10;9856:3;9852:20;9849:1;9842:31;9896:4;9893:1;9886:15;9924:4;9921:1;9914:15;9807:132;-1:-1:-1;9953:9:1;;9751:217::o

Swarm Source

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