false
true
0

Contract Address Details

0xe1cAF2F0da06A97A7f04B9Ea1B43C91F447cf343

Token
Claimable Rewards (CLAIMR)
Creator
0xc6eda6–db69f1 at 0x1c2267–a8c8a7
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1,700 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26042344
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
HelperToken




Optimization enabled
true
Compiler version
v0.8.20+commit.a1b79de6




Optimization runs
200
EVM Version
default




Verified at
2025-06-24T10:07:45.562975Z

Contract source code

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
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/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @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}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * Both 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IDTX.sol


// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;

interface IDTX {
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InvalidSender(address sender);
    error ERC20InvalidSpender(address spender);
    error OwnableInvalidOwner(address owner);
    error OwnableUnauthorizedAccount(address account);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function balanceOf(address account) external view returns (uint256);

    function burn(uint256 value) external;

    function burnFrom(address account, uint256 value) external;

    function burnToken(address account, uint256 amount) external returns (bool);

    function decimals() external view returns (uint8);

    function governor() external view returns (address);

    function masterchefAddress() external view returns (address);

    function mint(address to, uint256 amount) external;

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

    function owner() external view returns (address);

    function rebrandName(string memory _newName) external;

    function rebrandSymbol(string memory _newSymbol) external;

    function receiveTax() external view returns (address);

    function renounceOwnership() external;

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

    function tax() external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function transferOwnership(address newOwner) external;

    function updateTax(address _taxAddress) external;

    function updateTax(uint256 _tax) external;
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":[{"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":"value","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":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchefAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"}],"name":"rebrandName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"rebrandSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveTax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":[{"internalType":"address","name":"_taxAddress","type":"address"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/

// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IVault.sol


// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;

// Notice: For token vault (not native)
interface IVault {
    error AddressEmptyCode(address target);
    error AddressInsufficientBalance(address account);
    error FailedInnerCall();
    error SafeERC20FailedOperation(address token);
    event CollectedFee(uint256 amount);
    event Deposit(
        address indexed sender,
        uint256 amount,
        uint256 debt,
        uint256 depositFee,
        address referral
    );
    event Harvest(
        address indexed harvester,
        address indexed benficiary,
        uint256 stakeID,
        address harvestInto,
        uint256 harvestAmount,
        uint256 penalty,
        uint256 callFee
    );
    event SelfHarvest(
        address indexed user,
        address harvestInto,
        uint256 harvestAmount,
        uint256 penalty
    );
    event UserSettingUpdate(
        address indexed user,
        address poolAddress,
        uint256 threshold,
        uint256 feeToPay
    );
    event Withdraw(
        address indexed sender,
        uint256 stakeID,
        uint256 harvestAmount,
        uint256 penalty
    );

    function accDtxPerShare() external view returns (uint256);

    function calculateTotalPendingDTXRewards() external view returns (uint256);

    function collectCommission(
        address[] memory _beneficiary,
        uint256[][] memory _stakeID
    ) external;

    function collectCommissionAuto(address[] memory _beneficiary) external;

    function defaultDirectPayout() external view returns (uint256);

    function deposit(uint256 _amount, address referral) external;

    function depositFee() external view returns (uint256);

    function emergencyWithdraw(uint256 _stakeID) external;

    function emergencyWithdrawAll() external;

    function fundingRate() external view returns (uint256);

    function getNrOfStakes(address _user) external view returns (uint256);

    function harvest() external;

    function lastFundingChangeTimestamp() external view returns (uint256);

    function masterchef() external view returns (address);

    function maxFee() external view returns (uint256);

    function maxFundingFee() external view returns (uint256);

    function multiCall(address _user, uint256 _stakeID)
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        );

    function poolID() external view returns (uint256);

    function poolPayout(address)
        external
        view
        returns (uint256 amount, uint256 minServe);

    function publicBalanceOf() external view returns (uint256);

    function referralPoints(address) external view returns (uint256);

    function referredBy(address) external view returns (address);

    function selfHarvest(uint256[] memory _stakeID, address _harvestInto)
        external;

    function setDepositFee(uint256 _depositFee) external;

    function setFundingRate(uint256 _fundingRate) external;

    function setMasterChefAddress(address _masterchef, uint256 _newPoolID)
        external;

    function setPoolPayout(
        address _poolAddress,
        uint256 _amount,
        uint256 _minServe
    ) external;

    function setTreasury(address _newTreasury) external;

    function stakeToken() external view returns (address);

    function token() external view returns (address);

    function treasury() external view returns (address);

    function updateSettings(uint256 _defaultDirectHarvest) external;

    function userInfo(address, uint256)
        external
        view
        returns (
            uint256 amount,
            uint256 debt,
            uint256 feesPaid,
            uint256 lastAction
        );

    function viewPoolMinServe(address _contract)
        external
        view
        returns (uint256);

    function viewPoolPayout(address _contract) external view returns (uint256);

    function viewStakeEarnings(address _user, uint256 _stakeID)
        external
        view
        returns (uint256);

    function viewUserTotalEarnings(address _user)
        external
        view
        returns (uint256);

    function virtualAccDtxPerShare() external view returns (uint256);

    function withdraw(uint256 _stakeID, address _harvestInto) external;

    function withdrawStuckTokens(address _tokenAddress) external;
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IERC20","name":"_stakeToken","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollectedFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"referral","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"},{"indexed":true,"internalType":"address","name":"benficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"address","name":"harvestInto","type":"address"},{"indexed":false,"internalType":"uint256","name":"harvestAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callFee","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"harvestInto","type":"address"},{"indexed":false,"internalType":"uint256","name":"harvestAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"SelfHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"poolAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeToPay","type":"uint256"}],"name":"UserSettingUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"accDtxPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingDTXRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiary","type":"address[]"},{"internalType":"uint256[][]","name":"_stakeID","type":"uint256[][]"}],"name":"collectCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiary","type":"address[]"}],"name":"collectCommissionAuto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultDirectPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"referral","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNrOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastFundingChangeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFundingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"multiCall","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolPayout","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minServe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referredBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakeID","type":"uint256[]"},{"internalType":"address","name":"_harvestInto","type":"address"}],"name":"selfHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositFee","type":"uint256"}],"name":"setDepositFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fundingRate","type":"uint256"}],"name":"setFundingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_newPoolID","type":"uint256"}],"name":"setMasterChefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minServe","type":"uint256"}],"name":"setPoolPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_defaultDirectHarvest","type":"uint256"}],"name":"updateSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"uint256","name":"feesPaid","type":"uint256"},{"internalType":"uint256","name":"lastAction","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"viewPoolMinServe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"viewPoolPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"viewStakeEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"viewUserTotalEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualAccDtxPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_harvestInto","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/

// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IacPool.sol


// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity >=0.7.0 <0.9.0;

interface IacPool {
    event AddAndExtendStake(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 stakeID,
        uint256 shares,
        uint256 lastDepositedTime
    );
    event AddVotes(address indexed voter, uint256 proposalID, uint256 change);
    event Deposit(
        address indexed sender,
        uint256 amount,
        uint256 shares,
        uint256 lastDepositedTime
    );
    event GiftDeposit(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 shares,
        uint256 lastDepositedTime
    );
    event HopDeposit(
        address indexed recipient,
        uint256 amount,
        uint256 shares,
        uint256 previousLastDepositedTime,
        uint256 mandatoryTime
    );
    event HopPool(
        address indexed sender,
        uint256 DTXamount,
        uint256 shares,
        address indexed newPool
    );
    event MigrateStake(
        address indexed goodSamaritan,
        uint256 DTXamount,
        uint256 shares,
        address indexed recipient
    );
    event RemoveVotes(
        address indexed voter,
        uint256 proposalID,
        uint256 change
    );
    event SetDelegate(address userDelegating, address delegatee);
    event StakeAllowanceRevoke(
        address owner,
        address spender,
        uint256 allowanceID
    );
    event StakeApproval(
        address owner,
        address spender,
        uint256 allowanceID,
        uint256 shareAllowance,
        uint256 lastDeposit,
        uint256 mandatoryTime
    );
    event TransferStake(
        address indexed sender,
        address indexed recipient,
        uint256 shares,
        uint256 stakeID
    );
    event TransferStakeFrom(
        address _from,
        address _to,
        uint256 _stakeID,
        uint256 _allowanceID
    );
    event TrustedPool(address contractAddress, bool setting);
    event TrustedSender(address contractAddress, bool setting);
    event Withdraw(
        address indexed sender,
        uint256 amount,
        uint256 penalty,
        uint256 shares
    );

    function addAndExtendStake(
        address _recipientAddr,
        uint256 _amount,
        uint256 _stakeID,
        uint256 _lockUpTokensInSeconds
    ) external;

    function admin() external view returns (address);

    function allowOrigin() external view returns (bool);

    function allowStakeTransfer() external view returns (bool);

    function allowStakeTransferFrom() external view returns (bool);

    function allowTxOrigin(bool _setting) external;

    function balanceOf() external view returns (uint256);

    function calculateHarvestDTXRewards() external view returns (uint256);

    function calculateTotalPendingDTXRewards() external view returns (uint256);

    function callFee() external view returns (uint256);

    function delegateeVote(address[] memory votingAddress, uint256 proposalID)
        external;

    function deposit(uint256 _amount) external;

    function enableDisableStakeTransfer(bool _setting) external;

    function enableDisableStakeTransferFrom(bool _setting) external;

    function getNrOfStakes(address _user) external view returns (uint256);

    function getPricePerFullShare() external view returns (uint256);

    function getUserShares(address _wallet, uint256 _stakeID)
        external
        view
        returns (uint256);

    function getUserTotalShares(address _user) external view returns (uint256);

    function giftDeposit(
        uint256 _amount,
        address _toAddress,
        uint256 _minToServeInSecs
    ) external;

    function giveStakeAllowance(address spender, uint256 _stakeID) external;

    function gracePeriod() external view returns (uint256);

    function hopDeposit(
        uint256 _amount,
        address _recipientAddress,
        uint256 previousLastDepositedTime,
        uint256 _mandatoryTime
    ) external;

    function hopStakeToAnotherPool(
        uint256 _shares,
        uint256 _stakeID,
        address _poolAddress
    ) external;

    function masterchef() external view returns (address);

    function migrateAllStakes(address _staker) external;

    function migrateStake(address _staker, uint256 _stakeID) external;

    function migrationPool() external view returns (address);

    function minimumGift() external view returns (uint256);

    function modifyPartialTransfers(bool _decision) external;

    function modifyPartialWithdrawals(bool _decision) external;

    function nrOfstakeAllowances(address owner, address spender)
        external
        view
        returns (uint256);

    function partialTransfers() external view returns (bool);

    function partialWithdrawals() external view returns (bool);

    function poolID() external view returns (uint256);

    function revokeStakeAllowance(address spender, uint256 allowanceID)
        external;

    function setAdmin() external;

    function setCallFee(uint256 _callFee) external;

    function setDelegate(address _delegate, bool asProxy) external;

    function setMasterChefAddress(address _masterchef, uint256 _newPoolID)
        external;

    function setMigrationPool(address _newPool) external;

    function setMinimumGiftDeposit(uint256 _amount, bool _setting) external;

    function setTrustedPool(address[] memory _pool, bool _setting) external;

    function setTrustedSender(address[] memory _sender, bool _setting) external;

    function stakeAllowances(
        address owner,
        address spender,
        uint256 allowanceID
    )
        external
        view
        returns (
            uint256,
            uint256,
            uint256
        );

    function stakeRollover(address _poolInto, uint256 _stakeID) external;

    function token() external view returns (address);

    function totalShares() external view returns (uint256);

    function totalVotesForID(uint256) external view returns (uint256);

    function transferStakeFrom(
        address _from,
        uint256 _stakeID,
        uint256 allowanceID,
        address _to
    ) external returns (bool);

    function transferStakeToAnotherWallet(
        uint256 _shares,
        uint256 _stakeID,
        address _recipientAddress
    ) external;

    function treasury() external view returns (address);

    function trustedPool(address) external view returns (bool);

    function trustedPoolCount() external view returns (uint256);

    function trustedSender(address) external view returns (bool);

    function trustedSenderCount() external view returns (uint256);

    function updateMinGiftGovernor() external view returns (bool);

    function updateMinimumGift() external;

    function userDelegate(address) external view returns (address);

    function userInfo(address, uint256)
        external
        view
        returns (
            uint256 shares,
            uint256 lastDepositedTime,
            uint256 dtxAtLastUserAction,
            uint256 lastUserActionTime,
            uint256 mandatoryTimeToServe
        );

    function userVote(address) external view returns (uint256);

    function voteForProposal(uint256 proposalID, bool asProxy) external;

    function votingCredit(uint256 _shares, uint256 _stakeID) external;

    function votingCreditAddress() external view returns (address);

    function withdraw(uint256 _shares, uint256 _stakeID) external;

    function withdrawAll(uint256 _stakeID) external;

    function withdrawFeePeriod() external view returns (uint256);

    function withdrawStuckTokens(address _tokenAddress) external;
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IDTX","name":"_token","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"AddAndExtendStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"AddVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"GiftDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"HopDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"DTXamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"newPool","type":"address"}],"name":"HopPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"goodSamaritan","type":"address"},{"indexed":false,"internalType":"uint256","name":"DTXamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"MigrateStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"RemoveVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userDelegating","type":"address"},{"indexed":false,"internalType":"address","name":"delegatee","type":"address"}],"name":"SetDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"StakeAllowanceRevoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAllowance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"StakeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"TransferStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_allowanceID","type":"uint256"}],"name":"TransferStakeFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedSender","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_recipientAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"_lockUpTokensInSeconds","type":"uint256"}],"name":"addAndExtendStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowOrigin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"allowTxOrigin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateHarvestDTXRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingDTXRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"votingAddress","type":"address[]"},{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"delegateeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNrOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"getUserShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minToServeInSecs","type":"uint256"}],"name":"giftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"giveStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"_mandatoryTime","type":"uint256"}],"name":"hopDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_poolAddress","type":"address"}],"name":"hopStakeToAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"migrateAllStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"migrateStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumGift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"nrOfstakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"revokeStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"bool","name":"asProxy","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_newPoolID","type":"uint256"}],"name":"setMasterChefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPool","type":"address"}],"name":"setMigrationPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setMinimumGiftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pool","type":"address[]"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_sender","type":"address[]"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"stakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolInto","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRollover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IDTX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalVotesForID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"allowanceID","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferStakeFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"}],"name":"transferStakeToAnotherWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedPoolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedSenderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinGiftGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinimumGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"lastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"dtxAtLastUserAction","type":"uint256"},{"internalType":"uint256","name":"lastUserActionTime","type":"uint256"},{"internalType":"uint256","name":"mandatoryTimeToServe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalID","type":"uint256"},{"internalType":"bool","name":"asProxy","type":"bool"}],"name":"voteForProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"votingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingCreditAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/

// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IMasterChef.sol


// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;

interface IMasterChef {
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    event TransferCredit(address from, address to, uint256 amount);
    event TrustedContract(address contractAddress, bool setting);
    event UpdateEmissions(address indexed user, uint256 newEmissions);

    function DTXPerBlock() external view returns (uint256);

    function add(
        uint256 _allocPoint,
        address _participant,
        bool _withUpdate
    ) external;

    function burn(address _from, uint256 _amount) external returns (bool);

    function credit(address) external view returns (uint256);

    function dev(address _devaddr) external;

    function devaddr() external view returns (address);

    function dtx() external view returns (address);

    function existingParticipant(address) external view returns (bool);

    function fairMintSenate() external;

    function fairTokensPublishedToSenate() external view returns (uint256);

    function feeAddress() external view returns (address);

    function governorFee() external view returns (uint256);

    function massAdd(
        uint256[] memory _allocPoint,
        address[] memory _participant,
        bool[] memory _withUpdate
    ) external;

    function massUpdatePools() external;

    function owner() external view returns (address);

    function pendingDtx(uint256 _pid) external view returns (uint256);

    function poolInfo(uint256)
        external
        view
        returns (
            uint256 allocPoint,
            uint256 lastRewardBlock,
            address participant
        );

    function poolLength() external view returns (uint256);

    function publishTokens(address _to, uint256 _amount) external;

    function renounceOwnership() external;

    function renounceRewards() external;

    function rewardSenators(bool _e) external;

    function senatorRewards() external view returns (bool);

    function set(
        uint256 _pid,
        uint256 _allocPoint,
        bool _withUpdate
    ) external;

    function setFeeAddress(address _feeAddress) external;

    function setGovernorFee(uint256 _amount) external;

    function setTrustedContract(address _contractAddress, bool _setting)
        external;

    function startBlock() external view returns (uint256);

    function startPublishing(
        uint256 _pid,
        address _participant,
        uint256 _alloc
    ) external;

    function stopPublishing(uint256 _pid) external;

    function tokenChangeOwnership(address _newOwner) external;

    function totalAllocPoint() external view returns (uint256);

    function totalCreditRewards() external view returns (uint256);

    function totalCreditRewardsAtLastFairMint() external view returns (uint256);

    function totalPrincipalBurned() external view returns (uint256);

    function totalPublished() external view returns (uint256);

    function transferCredit(address _to, uint256 _amount) external;

    function transferOwnership(address newOwner) external;

    function trustedContract(address) external view returns (bool);

    function trustedContractCount() external view returns (uint256);

    function updateEmissionRate(uint256 _DTXPerBlock) external;

    function updatePool(uint256 _pid) external;

    function updateStartBlock(uint256 _startBlock) external;

    function virtualTotalSupply() external view returns (uint256);
}

// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[{"internalType":"contract IDTX","name":"_DTX","type":"address"},{"internalType":"address","name":"_airdropFull","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferCredit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"newEmissions","type":"uint256"}],"name":"UpdateEmissions","type":"event"},{"inputs":[],"name":"DTXPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_participant","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"credit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dtx","outputs":[{"internalType":"contract IDTX","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"existingParticipant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fairMintSenate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fairTokensPublishedToSenate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_allocPoint","type":"uint256[]"},{"internalType":"address[]","name":"_participant","type":"address[]"},{"internalType":"bool[]","name":"_withUpdate","type":"bool[]"}],"name":"massAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"pendingDtx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"address","name":"participant","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publishTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_e","type":"bool"}],"name":"rewardSenators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"senatorRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGovernorFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_participant","type":"address"},{"internalType":"uint256","name":"_alloc","type":"uint256"}],"name":"startPublishing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"stopPublishing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"tokenChangeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCreditRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCreditRewardsAtLastFairMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrincipalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublished","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedContractCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_DTXPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"name":"updateStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"virtualTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
*/

// File: DEGEN-main (9)/DEGEN-main/contracts/helperToken.sol


pragma solidity ^0.8.20;






interface IHarvestContract {
    function selfHarvest(address _userAddress, uint256[] calldata _stakeID) external;
}

contract HelperToken is ERC20 {
    struct PoolPayout {
        uint256 amount;
        uint256 minServe;
    }

    bool public transfersEnabled = false;
    mapping(address => bool) public whitelist;
    address public immutable TOKEN_X = 0x3E79130ab714E97ee73f86a56a2427bb1A519896;
    address public masterchef;
    address public feeAddress;

    mapping(address => uint256) public tokensClaimed;
    mapping(address => PoolPayout) public poolPayout; //determines the percentage received depending on withdrawal option
    uint256 public defaultDirectPayout = 50; //0.5% if withdrawn into wallet

    event TransfersToggled(bool enabled);
    event WhitelistUpdated(address indexed account, bool isWhitelisted);
    event ClaimReward(address indexed account, uint withdrawAmount, uint payoutAmount, address into);

    // Constructor sets TOKEN_X and whitelists the deployer
    constructor() ERC20("Claimable Rewards", "CLAIMR") {
        poolPayout[0xD9B491ac0f5487673500B67224b67b4171a08aCa].amount = 100;
        poolPayout[0xD9B491ac0f5487673500B67224b67b4171a08aCa].minServe = 864000;

        poolPayout[0x7ED33f65A0398cb26eaB2B03877825c96D9B6077].amount = 250;
        poolPayout[0x7ED33f65A0398cb26eaB2B03877825c96D9B6077].minServe = 2592000;

        poolPayout[0x3d175C8359169b0e830d36EA9CD3FE209f46f7BD].amount = 500;
        poolPayout[0x3d175C8359169b0e830d36EA9CD3FE209f46f7BD].minServe = 8640000;

        poolPayout[0xdE672FccA32365bD704c39bd1164a0D34a3a73e6].amount = 10000;
        poolPayout[0xdE672FccA32365bD704c39bd1164a0D34a3a73e6].minServe = 31536000; 
    }

    // Returns the governor address from the TOKEN_X contract
    function governor() public view returns (address) {
        return IDTX(TOKEN_X).governor();
    }

    // Modifier to restrict functions to the governor
    modifier onlyGovernor() {
        require(msg.sender == governor(), "ControlledToken: Caller is not governor");
        _;
    }

    // Modifier to check if transfers are enabled
    modifier whenTransfersEnabled() {
        require(transfersEnabled, "ControlledToken: Transfers are disabled");
        _;
    }

    // Modifier to check if caller is whitelisted
    modifier onlyWhitelisted() {
        require(whitelist[msg.sender], "ControlledToken: Caller is not whitelisted");
        _;
    }

    // Governor function to toggle transfers on/off
    function toggleTransfers(bool _enabled) external onlyGovernor {
        transfersEnabled = _enabled;
        emit TransfersToggled(_enabled);
    }

    function whitelistVaults() external {
        uint _poolLength = IMasterChef(masterchef).poolLength();
        for(uint i=4; i < _poolLength; i++) {
            ( , , address _vault) = IMasterChef(masterchef).poolInfo(i);
            if(!whitelist[_vault]) {
                whitelist[_vault] = true;
            }
        }
    }

    function claimWithHarvest(
        address[] calldata _contractAddresses,
        address _userAddress,
        uint256[][] calldata _stakeIDs,
        uint256 _amount,
        address _into
    ) external {
        require(
            _contractAddresses.length == _stakeIDs.length,
            "Mismatched contracts and stake IDs length"
        );
        require(_contractAddresses.length > 0, "No contracts provided");

        for (uint256 i = 0; i < _contractAddresses.length; i++) {
            IHarvestContract(_contractAddresses[i]).selfHarvest(_userAddress, _stakeIDs[i]);
        }

        claimRewards(_amount, _into);
    }

    function claimRewards(uint256 _amount, address _harvestInto) public {
        require(balanceOf(msg.sender) >= _amount, "Insufficient balance!");

        _burn(msg.sender, _amount);

        uint256 _payout = 0;

        if(_harvestInto == msg.sender) {
            _payout = _amount * defaultDirectPayout / 10000;
            IMasterChef(masterchef).publishTokens(msg.sender, _payout); 
            
		} else {
            require(poolPayout[_harvestInto].amount != 0, "incorrect pool!");
            _payout = _amount * poolPayout[_harvestInto].amount / 10000;
			IMasterChef(masterchef).publishTokens(address(this), _payout);
            IacPool(_harvestInto).giftDeposit(_payout, msg.sender, poolPayout[_harvestInto].minServe);
		}

        uint256 _penalty = _amount - _payout;
        if(_penalty > 0) {
            IMasterChef(masterchef).publishTokens(feeAddress, _penalty); //penalty to treasury
        }

        tokensClaimed[msg.sender]+= _payout;

        emit ClaimReward(msg.sender, _amount, _payout, _harvestInto);
    }

    function updateAddresses() external {
        masterchef = IDTX(TOKEN_X).masterchefAddress();
        feeAddress = IMasterChef(masterchef).feeAddress();
    }

    // Governor function to add/remove address from whitelist
    function updateWhitelist(address account, bool isWhitelisted) external onlyGovernor {
        require(account != address(0), "ControlledToken: Invalid address");
        whitelist[account] = isWhitelisted;
        emit WhitelistUpdated(account, isWhitelisted);
    }

    // Whitelisted addresses can mint tokens
    function mint(address to, uint256 amount) external onlyWhitelisted {
        require(to != address(0), "ControlledToken: Invalid recipient");
        _mint(to, amount);
    }

    // Whitelisted addresses can burn tokens
    function burn(address from, uint256 amount) external onlyWhitelisted {
        _burn(from, amount);
    }

    // Override transfer to enforce transfer toggle
    function transfer(address to, uint256 value) public override whenTransfersEnabled returns (bool) {
        return super.transfer(to, value);
    }

    // Override transferFrom to enforce transfer toggle
    function transferFrom(address from, address to, uint256 value) public override whenTransfersEnabled returns (bool) {
        return super.transferFrom(from, to, value);
    }

    function updateSettings(uint256 _defaultDirectHarvest) external onlyGovernor {
		require(_defaultDirectHarvest <= 10_000, "maximum 100%");
        defaultDirectPayout = _defaultDirectHarvest;
    }

    function setPoolPayout(address _poolAddress, uint256 _amount, uint256 _minServe) external onlyGovernor {
		require(_amount <= 10000, "out of range"); 
		poolPayout[_poolAddress].amount = _amount;
		poolPayout[_poolAddress].minServe = _minServe; //mandatory lockup(else stake for 5yr, withdraw with 82% penalty and receive 18%)
    }

    function viewPoolPayout(address _contract) external view returns (uint256) {
		return poolPayout[_contract].amount;
	}

	function viewPoolMinServe(address _contract) external view returns (uint256) {
		return poolPayout[_contract].minServe;
	}
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"type":"address","name":"approver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"type":"address","name":"receiver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"type":"address","name":"sender","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ClaimReward","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"uint256","name":"withdrawAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"payoutAmount","internalType":"uint256","indexed":false},{"type":"address","name":"into","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TransfersToggled","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"WhitelistUpdated","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"bool","name":"isWhitelisted","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"TOKEN_X","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimRewards","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_harvestInto","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimWithHarvest","inputs":[{"type":"address[]","name":"_contractAddresses","internalType":"address[]"},{"type":"address","name":"_userAddress","internalType":"address"},{"type":"uint256[][]","name":"_stakeIDs","internalType":"uint256[][]"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_into","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"defaultDirectPayout","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"masterchef","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"minServe","internalType":"uint256"}],"name":"poolPayout","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPoolPayout","inputs":[{"type":"address","name":"_poolAddress","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_minServe","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleTransfers","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensClaimed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfersEnabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAddresses","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSettings","inputs":[{"type":"uint256","name":"_defaultDirectHarvest","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateWhitelist","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"isWhitelisted","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"viewPoolMinServe","inputs":[{"type":"address","name":"_contract","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"viewPoolPayout","inputs":[{"type":"address","name":"_contract","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"whitelist","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"whitelistVaults","inputs":[]}]
              

Contract Creation Code

Verify & Publish
0x60a06040526005805460ff19169055733e79130ab714e97ee73f86a56a2427bb1a5198966080526032600b5534801562000037575f80fd5b5060405180604001604052806011815260200170436c61696d61626c65205265776172647360781b8152506040518060400160405280600681526020016521a620a4a6a960d11b815250816003908162000092919062000291565b506004620000a1828262000291565b5050600a6020525060647f06d296333231c039533a3f21ef1b6baee5d7353f86011f64dd309160abb6890a55620d2f007f06d296333231c039533a3f21ef1b6baee5d7353f86011f64dd309160abb6890b5560fa7fa0893105202dc6ee19abd93e3f6aa0c85cc30f7fff50567807b62ab402054aa95562278d007fa0893105202dc6ee19abd93e3f6aa0c85cc30f7fff50567807b62ab402054aaa556101f47fa91d3c8a4fc32cbeedea197a1e655ac7c98cc5d1b26de98e34e416c80226fa4d556283d6007fa91d3c8a4fc32cbeedea197a1e655ac7c98cc5d1b26de98e34e416c80226fa4e5573de672fcca32365bd704c39bd1164a0d34a3a73e65f526127107fecd87aa22c0a71c01701e646f0566d9921abbb899136fa4887f5ef2b4a1971e6556301e133807fecd87aa22c0a71c01701e646f0566d9921abbb899136fa4887f5ef2b4a1971e75562000359565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200021a57607f821691505b6020821081036200023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200028c575f81815260208120601f850160051c81016020861015620002675750805b601f850160051c820191505b81811015620002885782815560010162000273565b5050505b505050565b81516001600160401b03811115620002ad57620002ad620001f1565b620002c581620002be845462000205565b846200023f565b602080601f831160018114620002fb575f8415620002e35750858301515b5f19600386901b1c1916600185901b17855562000288565b5f85815260208120601f198616915b828110156200032b578886015182559484019460019091019084016200030a565b50858210156200034957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6080516119f3620003805f395f818161028b0152818161056d0152610f4401526119f35ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c806370a08231116100fe578063d084d69c1161009e578063e49c2b661161006e578063e49c2b6614610448578063ef05cf7614610470578063f0ea569a14610483578063fb1db278146104ae575f80fd5b8063d084d69c146103f7578063d4442e1f146103ff578063dd62ed3e14610408578063e26db6fc14610440575f80fd5b80639b19251a116100d95780639b19251a146103a25780639dc29fac146103c4578063a9059cbb146103d7578063bef97c87146103ea575f80fd5b806370a082311461035f57806374b876131461038757806395d89b411461039a575f80fd5b806323b872dd11610174578063624601b611610144578063624601b614610307578063646c41761461032657806368504158146103395780636c7b69cb1461034c575f80fd5b806323b872dd146102bf578063313ce567146102d257806340c10f19146102e157806341275358146102f4575f80fd5b80630d392cd9116101af5780630d392cd914610236578063102d89901461024b57806313e492d71461028657806318160ddd146102ad575f80fd5b806306fdde03146101d5578063095ea7b3146101f35780630c340a2414610216575b5f80fd5b6101dd6104c1565b6040516101ea9190611450565b60405180910390f35b6102066102013660046114b2565b610551565b60405190151581526020016101ea565b61021e61056a565b6040516001600160a01b0390911681526020016101ea565b6102496102443660046114f0565b6105f0565b005b610271610259366004611523565b600a6020525f90815260409020805460019091015482565b604080519283526020830191909152016101ea565b61021e7f000000000000000000000000000000000000000000000000000000000000000081565b6002545b6040519081526020016101ea565b6102066102cd36600461153e565b6106e5565b604051601281526020016101ea565b6102496102ef3660046114b2565b61071c565b60085461021e906001600160a01b031681565b6102b1610315366004611523565b60096020525f908152604090205481565b61024961033436600461157c565b6107b9565b6102496103473660046115ae565b610853565b61024961035a3660046115c7565b6108d2565b6102b161036d366004611523565b6001600160a01b03165f9081526020819052604090205490565b61024961039536600461163d565b610c0b565b6101dd610d87565b6102066103b0366004611523565b60066020525f908152604090205460ff1681565b6102496103d23660046114b2565b610d96565b6102066103e53660046114b2565b610dce565b6005546102069060ff1681565b610249610e03565b6102b1600b5481565b6102b16104163660046116d8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610249610f42565b6102b1610456366004611523565b6001600160a01b03165f908152600a602052604090205490565b61024961047e366004611704565b611060565b6102b1610491366004611523565b6001600160a01b03165f908152600a602052604090206001015490565b60075461021e906001600160a01b031681565b6060600380546104d09061171b565b80601f01602080910402602001604051908101604052809291908181526020018280546104fc9061171b565b80156105475780601f1061051e57610100808354040283529160200191610547565b820191905f5260205f20905b81548152906001019060200180831161052a57829003601f168201915b5050505050905090565b5f3361055e8185856110de565b60019150505b92915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105eb9190611753565b905090565b6105f861056a565b6001600160a01b0316336001600160a01b0316146106315760405162461bcd60e51b81526004016106289061176e565b60405180910390fd5b6001600160a01b0382166106875760405162461bcd60e51b815260206004820181905260248201527f436f6e74726f6c6c6564546f6b656e3a20496e76616c696420616464726573736044820152606401610628565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d910160405180910390a25050565b6005545f9060ff166107095760405162461bcd60e51b8152600401610628906117b5565b6107148484846110f0565b949350505050565b335f9081526006602052604090205460ff1661074a5760405162461bcd60e51b8152600401610628906117fc565b6001600160a01b0382166107ab5760405162461bcd60e51b815260206004820152602260248201527f436f6e74726f6c6c6564546f6b656e3a20496e76616c696420726563697069656044820152611b9d60f21b6064820152608401610628565b6107b58282611113565b5050565b6107c161056a565b6001600160a01b0316336001600160a01b0316146107f15760405162461bcd60e51b81526004016106289061176e565b6127108211156108325760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610628565b6001600160a01b039092165f908152600a6020526040902090815560010155565b61085b61056a565b6001600160a01b0316336001600160a01b03161461088b5760405162461bcd60e51b81526004016106289061176e565b6005805460ff19168215159081179091556040519081527fe1965432af4c9923f6ebb98f1721262967cfa6178008742d23041dc8ee74ee8f9060200160405180910390a150565b335f908152602081905260409020548211156109285760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e742062616c616e63652160581b6044820152606401610628565b6109323383611147565b5f336001600160a01b038316036109c357612710600b5484610954919061185a565b61095e9190611871565b600754604051632a98027560e01b8152336004820152602481018390529192506001600160a01b031690632a980275906044015f604051808303815f87803b1580156109a8575f80fd5b505af11580156109ba573d5f803e3d5ffd5b50505050610b20565b6001600160a01b0382165f908152600a60205260408120549003610a1b5760405162461bcd60e51b815260206004820152600f60248201526e696e636f727265637420706f6f6c2160881b6044820152606401610628565b6001600160a01b0382165f908152600a602052604090205461271090610a41908561185a565b610a4b9190611871565b600754604051632a98027560e01b8152306004820152602481018390529192506001600160a01b031690632a980275906044015f604051808303815f87803b158015610a95575f80fd5b505af1158015610aa7573d5f803e3d5ffd5b505050506001600160a01b0382165f818152600a60205260409081902060010154905163859f267f60e01b815260048101849052336024820152604481019190915263859f267f906064015f604051808303815f87803b158015610b09575f80fd5b505af1158015610b1b573d5f803e3d5ffd5b505050505b5f610b2b8285611890565b90508015610b9757600754600854604051632a98027560e01b81526001600160a01b03918216600482015260248101849052911690632a980275906044015f604051808303815f87803b158015610b80575f80fd5b505af1158015610b92573d5f803e3d5ffd5b505050505b335f9081526009602052604081208054849290610bb59084906118a3565b909155505060408051858152602081018490526001600160a01b03851681830152905133917fa9a79b2d1efde307a879325e70b30648b41dda4d6f37af338e5f91c258b72c3f919081900360600190a250505050565b858314610c6c5760405162461bcd60e51b815260206004820152602960248201527f4d69736d61746368656420636f6e74726163747320616e64207374616b652049604482015268088e640d8cadccee8d60bb1b6064820152608401610628565b85610cb15760405162461bcd60e51b8152602060048201526015602482015274139bc818dbdb9d1c9858dd1cc81c1c9bdd9a591959605a1b6044820152606401610628565b5f5b86811015610d7357878782818110610ccd57610ccd6118b6565b9050602002016020810190610ce29190611523565b6001600160a01b031663b206c11a87878785818110610d0357610d036118b6565b9050602002810190610d1591906118ca565b6040518463ffffffff1660e01b8152600401610d3393929190611910565b5f604051808303815f87803b158015610d4a575f80fd5b505af1158015610d5c573d5f803e3d5ffd5b505050508080610d6b90611958565b915050610cb3565b50610d7e82826108d2565b50505050505050565b6060600480546104d09061171b565b335f9081526006602052604090205460ff16610dc45760405162461bcd60e51b8152600401610628906117fc565b6107b58282611147565b6005545f9060ff16610df25760405162461bcd60e51b8152600401610628906117b5565b610dfc838361117b565b9392505050565b6007546040805163040f1f6d60e11b815290515f926001600160a01b03169163081e3eda9160048083019260209291908290030181865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190611970565b905060045b818110156107b557600754604051631526fe2760e01b8152600481018390525f916001600160a01b031690631526fe2790602401606060405180830381865afa158015610ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee69190611987565b6001600160a01b0381165f9081526006602052604090205490935060ff169150610f2f9050576001600160a01b0381165f908152600660205260409020805460ff191660011790555b5080610f3a81611958565b915050610e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c34b586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc29190611753565b600780546001600160a01b0319166001600160a01b0392909216918217905560408051630824ea6b60e31b815290516341275358916004808201926020929091908290030181865afa15801561101a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103e9190611753565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61106861056a565b6001600160a01b0316336001600160a01b0316146110985760405162461bcd60e51b81526004016106289061176e565b6127108111156110d95760405162461bcd60e51b815260206004820152600c60248201526b6d6178696d756d203130302560a01b6044820152606401610628565b600b55565b6110eb8383836001611188565b505050565b5f336110fd85828561125b565b6111088585856112d1565b506001949350505050565b6001600160a01b03821661113c5760405163ec442f0560e01b81525f6004820152602401610628565b6107b55f838361132a565b6001600160a01b03821661117057604051634b637e8f60e11b81525f6004820152602401610628565b6107b5825f8361132a565b5f3361055e8185856112d1565b6001600160a01b0384166111b15760405163e602df0560e01b81525f6004820152602401610628565b6001600160a01b0383166111da57604051634a1406b160e11b81525f6004820152602401610628565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561125557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161124c91815260200190565b60405180910390a35b50505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981101561125557818110156112c357604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610628565b61125584848484035f611188565b6001600160a01b0383166112fa57604051634b637e8f60e11b81525f6004820152602401610628565b6001600160a01b0382166113235760405163ec442f0560e01b81525f6004820152602401610628565b6110eb8383835b6001600160a01b038316611354578060025f82825461134991906118a3565b909155506113c49050565b6001600160a01b0383165f90815260208190526040902054818110156113a65760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610628565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166113e0576002805482900390556113fe565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161144391815260200190565b60405180910390a3505050565b5f6020808352835180828501525f5b8181101561147b5785810183015185820160400152820161145f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146114af575f80fd5b50565b5f80604083850312156114c3575f80fd5b82356114ce8161149b565b946020939093013593505050565b803580151581146114eb575f80fd5b919050565b5f8060408385031215611501575f80fd5b823561150c8161149b565b915061151a602084016114dc565b90509250929050565b5f60208284031215611533575f80fd5b8135610dfc8161149b565b5f805f60608486031215611550575f80fd5b833561155b8161149b565b9250602084013561156b8161149b565b929592945050506040919091013590565b5f805f6060848603121561158e575f80fd5b83356115998161149b565b95602085013595506040909401359392505050565b5f602082840312156115be575f80fd5b610dfc826114dc565b5f80604083850312156115d8575f80fd5b8235915060208301356115ea8161149b565b809150509250929050565b5f8083601f840112611605575f80fd5b50813567ffffffffffffffff81111561161c575f80fd5b6020830191508360208260051b8501011115611636575f80fd5b9250929050565b5f805f805f805f60a0888a031215611653575f80fd5b873567ffffffffffffffff8082111561166a575f80fd5b6116768b838c016115f5565b909950975060208a0135915061168b8261149b565b909550604089013590808211156116a0575f80fd5b506116ad8a828b016115f5565b9095509350506060880135915060808801356116c88161149b565b8091505092959891949750929550565b5f80604083850312156116e9575f80fd5b82356116f48161149b565b915060208301356115ea8161149b565b5f60208284031215611714575f80fd5b5035919050565b600181811c9082168061172f57607f821691505b60208210810361174d57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611763575f80fd5b8151610dfc8161149b565b60208082526027908201527f436f6e74726f6c6c6564546f6b656e3a2043616c6c6572206973206e6f74206760408201526637bb32b93737b960c91b606082015260800190565b60208082526027908201527f436f6e74726f6c6c6564546f6b656e3a205472616e73666572732061726520646040820152661a5cd8589b195960ca1b606082015260800190565b6020808252602a908201527f436f6e74726f6c6c6564546f6b656e3a2043616c6c6572206973206e6f7420776040820152691a1a5d195b1a5cdd195960b21b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761056457610564611846565b5f8261188b57634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561056457610564611846565b8082018082111561056457610564611846565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e198436030181126118df575f80fd5b83018035915067ffffffffffffffff8211156118f9575f80fd5b6020019150600581901b3603821315611636575f80fd5b6001600160a01b038416815260406020820181905281018290525f6001600160fb1b0383111561193e575f80fd5b8260051b8085606085013791909101606001949350505050565b5f6001820161196957611969611846565b5060010190565b5f60208284031215611980575f80fd5b5051919050565b5f805f60608486031215611999575f80fd5b835192506020840151915060408401516119b28161149b565b80915050925092509256fea264697066735822122000edc89bcc96cf856edad8d93f1e3d6d21f41b2803a445381a75e03f9290e1cb64736f6c63430008140033

Deployed ByteCode

0x608060405234801561000f575f80fd5b50600436106101d1575f3560e01c806370a08231116100fe578063d084d69c1161009e578063e49c2b661161006e578063e49c2b6614610448578063ef05cf7614610470578063f0ea569a14610483578063fb1db278146104ae575f80fd5b8063d084d69c146103f7578063d4442e1f146103ff578063dd62ed3e14610408578063e26db6fc14610440575f80fd5b80639b19251a116100d95780639b19251a146103a25780639dc29fac146103c4578063a9059cbb146103d7578063bef97c87146103ea575f80fd5b806370a082311461035f57806374b876131461038757806395d89b411461039a575f80fd5b806323b872dd11610174578063624601b611610144578063624601b614610307578063646c41761461032657806368504158146103395780636c7b69cb1461034c575f80fd5b806323b872dd146102bf578063313ce567146102d257806340c10f19146102e157806341275358146102f4575f80fd5b80630d392cd9116101af5780630d392cd914610236578063102d89901461024b57806313e492d71461028657806318160ddd146102ad575f80fd5b806306fdde03146101d5578063095ea7b3146101f35780630c340a2414610216575b5f80fd5b6101dd6104c1565b6040516101ea9190611450565b60405180910390f35b6102066102013660046114b2565b610551565b60405190151581526020016101ea565b61021e61056a565b6040516001600160a01b0390911681526020016101ea565b6102496102443660046114f0565b6105f0565b005b610271610259366004611523565b600a6020525f90815260409020805460019091015482565b604080519283526020830191909152016101ea565b61021e7f0000000000000000000000003e79130ab714e97ee73f86a56a2427bb1a51989681565b6002545b6040519081526020016101ea565b6102066102cd36600461153e565b6106e5565b604051601281526020016101ea565b6102496102ef3660046114b2565b61071c565b60085461021e906001600160a01b031681565b6102b1610315366004611523565b60096020525f908152604090205481565b61024961033436600461157c565b6107b9565b6102496103473660046115ae565b610853565b61024961035a3660046115c7565b6108d2565b6102b161036d366004611523565b6001600160a01b03165f9081526020819052604090205490565b61024961039536600461163d565b610c0b565b6101dd610d87565b6102066103b0366004611523565b60066020525f908152604090205460ff1681565b6102496103d23660046114b2565b610d96565b6102066103e53660046114b2565b610dce565b6005546102069060ff1681565b610249610e03565b6102b1600b5481565b6102b16104163660046116d8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610249610f42565b6102b1610456366004611523565b6001600160a01b03165f908152600a602052604090205490565b61024961047e366004611704565b611060565b6102b1610491366004611523565b6001600160a01b03165f908152600a602052604090206001015490565b60075461021e906001600160a01b031681565b6060600380546104d09061171b565b80601f01602080910402602001604051908101604052809291908181526020018280546104fc9061171b565b80156105475780601f1061051e57610100808354040283529160200191610547565b820191905f5260205f20905b81548152906001019060200180831161052a57829003601f168201915b5050505050905090565b5f3361055e8185856110de565b60019150505b92915050565b5f7f0000000000000000000000003e79130ab714e97ee73f86a56a2427bb1a5198966001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105eb9190611753565b905090565b6105f861056a565b6001600160a01b0316336001600160a01b0316146106315760405162461bcd60e51b81526004016106289061176e565b60405180910390fd5b6001600160a01b0382166106875760405162461bcd60e51b815260206004820181905260248201527f436f6e74726f6c6c6564546f6b656e3a20496e76616c696420616464726573736044820152606401610628565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d910160405180910390a25050565b6005545f9060ff166107095760405162461bcd60e51b8152600401610628906117b5565b6107148484846110f0565b949350505050565b335f9081526006602052604090205460ff1661074a5760405162461bcd60e51b8152600401610628906117fc565b6001600160a01b0382166107ab5760405162461bcd60e51b815260206004820152602260248201527f436f6e74726f6c6c6564546f6b656e3a20496e76616c696420726563697069656044820152611b9d60f21b6064820152608401610628565b6107b58282611113565b5050565b6107c161056a565b6001600160a01b0316336001600160a01b0316146107f15760405162461bcd60e51b81526004016106289061176e565b6127108211156108325760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610628565b6001600160a01b039092165f908152600a6020526040902090815560010155565b61085b61056a565b6001600160a01b0316336001600160a01b03161461088b5760405162461bcd60e51b81526004016106289061176e565b6005805460ff19168215159081179091556040519081527fe1965432af4c9923f6ebb98f1721262967cfa6178008742d23041dc8ee74ee8f9060200160405180910390a150565b335f908152602081905260409020548211156109285760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e742062616c616e63652160581b6044820152606401610628565b6109323383611147565b5f336001600160a01b038316036109c357612710600b5484610954919061185a565b61095e9190611871565b600754604051632a98027560e01b8152336004820152602481018390529192506001600160a01b031690632a980275906044015f604051808303815f87803b1580156109a8575f80fd5b505af11580156109ba573d5f803e3d5ffd5b50505050610b20565b6001600160a01b0382165f908152600a60205260408120549003610a1b5760405162461bcd60e51b815260206004820152600f60248201526e696e636f727265637420706f6f6c2160881b6044820152606401610628565b6001600160a01b0382165f908152600a602052604090205461271090610a41908561185a565b610a4b9190611871565b600754604051632a98027560e01b8152306004820152602481018390529192506001600160a01b031690632a980275906044015f604051808303815f87803b158015610a95575f80fd5b505af1158015610aa7573d5f803e3d5ffd5b505050506001600160a01b0382165f818152600a60205260409081902060010154905163859f267f60e01b815260048101849052336024820152604481019190915263859f267f906064015f604051808303815f87803b158015610b09575f80fd5b505af1158015610b1b573d5f803e3d5ffd5b505050505b5f610b2b8285611890565b90508015610b9757600754600854604051632a98027560e01b81526001600160a01b03918216600482015260248101849052911690632a980275906044015f604051808303815f87803b158015610b80575f80fd5b505af1158015610b92573d5f803e3d5ffd5b505050505b335f9081526009602052604081208054849290610bb59084906118a3565b909155505060408051858152602081018490526001600160a01b03851681830152905133917fa9a79b2d1efde307a879325e70b30648b41dda4d6f37af338e5f91c258b72c3f919081900360600190a250505050565b858314610c6c5760405162461bcd60e51b815260206004820152602960248201527f4d69736d61746368656420636f6e74726163747320616e64207374616b652049604482015268088e640d8cadccee8d60bb1b6064820152608401610628565b85610cb15760405162461bcd60e51b8152602060048201526015602482015274139bc818dbdb9d1c9858dd1cc81c1c9bdd9a591959605a1b6044820152606401610628565b5f5b86811015610d7357878782818110610ccd57610ccd6118b6565b9050602002016020810190610ce29190611523565b6001600160a01b031663b206c11a87878785818110610d0357610d036118b6565b9050602002810190610d1591906118ca565b6040518463ffffffff1660e01b8152600401610d3393929190611910565b5f604051808303815f87803b158015610d4a575f80fd5b505af1158015610d5c573d5f803e3d5ffd5b505050508080610d6b90611958565b915050610cb3565b50610d7e82826108d2565b50505050505050565b6060600480546104d09061171b565b335f9081526006602052604090205460ff16610dc45760405162461bcd60e51b8152600401610628906117fc565b6107b58282611147565b6005545f9060ff16610df25760405162461bcd60e51b8152600401610628906117b5565b610dfc838361117b565b9392505050565b6007546040805163040f1f6d60e11b815290515f926001600160a01b03169163081e3eda9160048083019260209291908290030181865afa158015610e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6e9190611970565b905060045b818110156107b557600754604051631526fe2760e01b8152600481018390525f916001600160a01b031690631526fe2790602401606060405180830381865afa158015610ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee69190611987565b6001600160a01b0381165f9081526006602052604090205490935060ff169150610f2f9050576001600160a01b0381165f908152600660205260409020805460ff191660011790555b5080610f3a81611958565b915050610e73565b7f0000000000000000000000003e79130ab714e97ee73f86a56a2427bb1a5198966001600160a01b03166340c34b586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc29190611753565b600780546001600160a01b0319166001600160a01b0392909216918217905560408051630824ea6b60e31b815290516341275358916004808201926020929091908290030181865afa15801561101a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103e9190611753565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61106861056a565b6001600160a01b0316336001600160a01b0316146110985760405162461bcd60e51b81526004016106289061176e565b6127108111156110d95760405162461bcd60e51b815260206004820152600c60248201526b6d6178696d756d203130302560a01b6044820152606401610628565b600b55565b6110eb8383836001611188565b505050565b5f336110fd85828561125b565b6111088585856112d1565b506001949350505050565b6001600160a01b03821661113c5760405163ec442f0560e01b81525f6004820152602401610628565b6107b55f838361132a565b6001600160a01b03821661117057604051634b637e8f60e11b81525f6004820152602401610628565b6107b5825f8361132a565b5f3361055e8185856112d1565b6001600160a01b0384166111b15760405163e602df0560e01b81525f6004820152602401610628565b6001600160a01b0383166111da57604051634a1406b160e11b81525f6004820152602401610628565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561125557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161124c91815260200190565b60405180910390a35b50505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981101561125557818110156112c357604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610628565b61125584848484035f611188565b6001600160a01b0383166112fa57604051634b637e8f60e11b81525f6004820152602401610628565b6001600160a01b0382166113235760405163ec442f0560e01b81525f6004820152602401610628565b6110eb8383835b6001600160a01b038316611354578060025f82825461134991906118a3565b909155506113c49050565b6001600160a01b0383165f90815260208190526040902054818110156113a65760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610628565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166113e0576002805482900390556113fe565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161144391815260200190565b60405180910390a3505050565b5f6020808352835180828501525f5b8181101561147b5785810183015185820160400152820161145f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146114af575f80fd5b50565b5f80604083850312156114c3575f80fd5b82356114ce8161149b565b946020939093013593505050565b803580151581146114eb575f80fd5b919050565b5f8060408385031215611501575f80fd5b823561150c8161149b565b915061151a602084016114dc565b90509250929050565b5f60208284031215611533575f80fd5b8135610dfc8161149b565b5f805f60608486031215611550575f80fd5b833561155b8161149b565b9250602084013561156b8161149b565b929592945050506040919091013590565b5f805f6060848603121561158e575f80fd5b83356115998161149b565b95602085013595506040909401359392505050565b5f602082840312156115be575f80fd5b610dfc826114dc565b5f80604083850312156115d8575f80fd5b8235915060208301356115ea8161149b565b809150509250929050565b5f8083601f840112611605575f80fd5b50813567ffffffffffffffff81111561161c575f80fd5b6020830191508360208260051b8501011115611636575f80fd5b9250929050565b5f805f805f805f60a0888a031215611653575f80fd5b873567ffffffffffffffff8082111561166a575f80fd5b6116768b838c016115f5565b909950975060208a0135915061168b8261149b565b909550604089013590808211156116a0575f80fd5b506116ad8a828b016115f5565b9095509350506060880135915060808801356116c88161149b565b8091505092959891949750929550565b5f80604083850312156116e9575f80fd5b82356116f48161149b565b915060208301356115ea8161149b565b5f60208284031215611714575f80fd5b5035919050565b600181811c9082168061172f57607f821691505b60208210810361174d57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611763575f80fd5b8151610dfc8161149b565b60208082526027908201527f436f6e74726f6c6c6564546f6b656e3a2043616c6c6572206973206e6f74206760408201526637bb32b93737b960c91b606082015260800190565b60208082526027908201527f436f6e74726f6c6c6564546f6b656e3a205472616e73666572732061726520646040820152661a5cd8589b195960ca1b606082015260800190565b6020808252602a908201527f436f6e74726f6c6c6564546f6b656e3a2043616c6c6572206973206e6f7420776040820152691a1a5d195b1a5cdd195960b21b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761056457610564611846565b5f8261188b57634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561056457610564611846565b8082018082111561056457610564611846565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e198436030181126118df575f80fd5b83018035915067ffffffffffffffff8211156118f9575f80fd5b6020019150600581901b3603821315611636575f80fd5b6001600160a01b038416815260406020820181905281018290525f6001600160fb1b0383111561193e575f80fd5b8260051b8085606085013791909101606001949350505050565b5f6001820161196957611969611846565b5060010190565b5f60208284031215611980575f80fd5b5051919050565b5f805f60608486031215611999575f80fd5b835192506020840151915060408401516119b28161149b565b80915050925092509256fea264697066735822122000edc89bcc96cf856edad8d93f1e3d6d21f41b2803a445381a75e03f9290e1cb64736f6c63430008140033