false
true
0

Contract Address Details

0x0107Fa4F5B4eD84dAF188770D7096654cb4AdE35

Token
INC Reward Service (IRS)
Creator
0x7811eb–1fe369 at 0x927918–6776b4
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1,192 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26047298
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
IRS




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




Optimization runs
200
EVM Version
shanghai




Verified at
2025-07-23T23:36:10.599117Z

Contract source code

// SPDX-License-Identifier: MIT
// File: IRS/Context.sol



pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
	
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: IRS/Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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



pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

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

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

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

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

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

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



pragma solidity 0.8.20;

/// @title PulseX Factory Interface
/// @notice Interface for creating liquidity pairs on PulseX
interface IPulseXFactory {
    /// @notice Creates a new trading pair between two tokens
    /// @param tokenA Address of the first token
    /// @param tokenB Address of the second token
    /// @return pair Address of the newly created pair contract
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

/// @title PulseX Router Interface
/// @notice Interface for interacting with PulseX Router for swaps and liquidity
interface IPulseXRouter {
    /// @notice Returns the address of the factory contract
    /// @return Address of the PulseX factory
    function factory() external pure returns (address);

	/**
	 * @notice Swaps an exact amount of input tokens for another ERC20 token
	 * @dev Supports fee-on-transfer tokens
	 * @param amountIn Amount of input tokens to send
	 * @param amountOutMin Minimum amount of output tokens to receive
	 * @param path Array of token addresses (e.g., tokenIn → INC)
	 * @param to Address to receive the output tokens
	 * @param deadline Unix timestamp after which the transaction will revert
	*/
	function swapExactTokensForTokensSupportingFeeOnTransferTokens(
		uint amountIn,
		uint amountOutMin,
		address[] calldata path,
		address to,
		uint deadline
	) external;
	

    /**
	 * @notice Adds liquidity to a token/token pair
	 * @param tokenA Address of the first ERC20 token
	 * @param tokenB Address of the second ERC20 token
	 * @param amountADesired Amount of tokenA to add
	 * @param amountBDesired Amount of tokenB to add
	 * @param amountAMin Minimum amount of tokenA to add (slippage)
	 * @param amountBMin Minimum amount of tokenB to add (slippage)
	 * @param to Address that receives the LP tokens
	 * @param deadline Time after which transaction is invalid
	 * @return amountA Amount of tokenA added
	 * @return amountB Amount of tokenB added
	 * @return liquidity Amount of LP tokens minted
	*/
	function addLiquidity(
		address tokenA,
		address tokenB,
		uint amountADesired,
		uint amountBDesired,
		uint amountAMin,
		uint amountBMin,
		address to,
		uint deadline
	) external returns (uint amountA, uint amountB, uint liquidity);
}

/// @title PulseX Pair Interface
/// @notice Interface for querying pair token addresses in a PulseX liquidity pool
interface IPulseXPair {
    /// @notice Returns the address of token0 in the pair
    /// @return Address of token0
    function token0() external view returns (address);

    /// @notice Returns the address of token1 in the pair
    /// @return Address of token1
    function token1() external view returns (address);
}

// File: IRS/Distributor.sol



pragma solidity ^0.8.0;



/**
 * @title IDistributor
 * @notice Interface for the Dividend Distributor contract.
 */
interface IDistributor {
    /**
     * @notice Sets distribution criteria such as minimum period and minimum distribution.
     * @param minPeriod Minimum time between claims for a shareholder (in seconds).
     * @param minDistribution Minimum amount of reward (in wei) to trigger a distribution.
     */
    function setDistributionCriteria(uint256 minPeriod, uint256 minDistribution) external;

    /**
     * @notice Sets the share of a specific shareholder.
     * @param shareholder Address of the shareholder.
     * @param amount Number of tokens held by the shareholder.
     */
    function setShare(address shareholder, uint256 amount) external;

    /**
     * @notice Deposit tokens (e.g., INC) into the distributor to be shared.
     */
    function deposit(uint256 amount) external;

    /**
     * @notice Distributes rewards to shareholders using the specified gas limit.
     * @param gas Maximum gas to use for distribution loop.
     */
    function process(uint256 gas) external;
	
	/**
	 * @notice Adds liquidity to PulseX with ERC20 tokens (Token + INC)
	 * @param liqudityToken Amount of this token to add
	 * @param liqudityShare Amount of INC to pair with tokens
	*/
	function addLiquidity(uint256 liqudityToken, uint256 liqudityShare) external;
}

/**
 * @title ReentrancyGuard
 * @notice Protects against reentrant calls to functions using a simple status lock.
 */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     */
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * @title Distributor
 * @notice Manages dividend distribution to token holders proportionally to their share.
 * @dev Only callable by the token contract (owner). Uses ReentrancyGuard to prevent claim loops.
 */
contract Distributor is IDistributor, ReentrancyGuard {
    /// @notice Address of the token contract that owns this distributor.
    address owner;
	
    /**
     * @notice Stores shareholder-specific information for dividend tracking.
     * @param amount Number of shares (tokens) the shareholder holds.
     * @param totalExcluded Cumulative dividends excluded from this shareholder (to avoid double-counting).
     * @param totalRealised Total amount of dividends the shareholder has received.
     */
    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
	
	/// @notice INC address
	address public immutable rewardToken;
	
	/// @notice PulseX Router interface
	IPulseXRouter public immutable pulsexRouter;
	
    /// @notice List of all current shareholders.
    address[] shareholders;

    /// @notice Mapping from shareholder address to their index in the `shareholders` array.
    mapping (address => uint256) public shareholderIndexes;

    /// @notice Timestamp of the last claim for each shareholder.
    mapping (address => uint256) public shareholderClaims;

    /// @notice Mapping from address to their share details.
    mapping (address => Share) public shares;

    /// @notice Emitted when the distribution criteria are updated.
    /// @param minPeriod Minimum time between distributions (in seconds).
    /// @param minDistribution Minimum amount of dividends to trigger a distribution (in wei).
    event DistributionCriteriaUpdate(uint256 minPeriod, uint256 minDistribution);

    /// @notice Emitted when new funds are deposited into the distributor.
    /// @param amount Amount of tokens (e.g., INC) deposited.
    event NewFundDeposit(address indexed depositor, uint256 amount);
	
	/// @notice Emitted when dividends are distributed to a shareholder.
	/// @param shareholder The address receiving the dividend.
	/// @param amount The amount of tokens (INC) distributed.
	event DividendDistributed(address indexed shareholder, uint256 amount);

    /// @notice Total number of shares held by all shareholders.
    uint256 public totalShares;

    /// @notice Total amount of dividends that have been deposited.
    uint256 public totalDividends;

    /// @notice Total amount of dividends that have been distributed.
    uint256 public totalDistributed;

    /// @notice Dividends per share scaled by the `dividendsPerShareAccuracyFactor`.
    uint256 public dividendsPerShare;

    /// @notice Factor used to maintain precision when calculating dividends per share.
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    /// @notice Minimum time between dividend distributions for each shareholder (in seconds).
    uint256 public minPeriod = 10;

    /// @notice Minimum dividend amount (in wei) required to trigger a distribution.
    uint256 public minDistribution = 1 * (10**10);

    /// @notice Current index used to iterate through shareholders during processing.
    uint256 currentIndex;
	
	/**
     * @dev Modifier to restrict access to the contract owner.
     */
	
    modifier onlyOwner() {
        require(msg.sender == owner, "!Token"); _;
    }
	
    constructor (address reward, address router) {
		rewardToken = address(reward);
		pulsexRouter = IPulseXRouter(router);
		owner = msg.sender;
    }
	
	/**
     * @notice Accepts incoming native token transfers (PLS, ETH).
     */
	receive() external payable {}
	
	/**
     * @inheritdoc IDistributor
     */
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyOwner {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
		emit DistributionCriteriaUpdate(minPeriod, minDistribution);
    }
	
	/**
     * @inheritdoc IDistributor
     */
    function setShare(address shareholder, uint256 amount) external override onlyOwner {
        if(shares[shareholder].amount > 0)
		{
			distributeDividend(shareholder);
        }
		if(amount > 0 && shares[shareholder].amount == 0)
		{
            addShareholder(shareholder);
        }
		else if(amount == 0 && shares[shareholder].amount > 0)
		{
           removeShareholder(shareholder);
        }
        totalShares = totalShares - shares[shareholder].amount + amount;
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

	/**
     * @inheritdoc IDistributor
     */
    function deposit(uint256 amount) external onlyOwner {
		totalDividends += amount;
		dividendsPerShare += ((dividendsPerShareAccuracyFactor * amount) / totalShares);
		
		uint256 balance = IERC20(owner).balanceOf(address(this));
		if(balance > 0)
		{
			try IERC20(owner).transfer(address(owner), balance) {} catch {}
		}
		emit NewFundDeposit(msg.sender, amount);
    }
	
	/**
     * @inheritdoc IDistributor
     */
    function process(uint256 gas) external override onlyOwner {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount)
			{
                currentIndex = 0;
            }
            if(shouldDistribute(shareholders[currentIndex]))
			{
                distributeDividend(shareholders[currentIndex]);
            }
            gasUsed = gasUsed + gasLeft - gasleft();
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

	/**
     * @notice Determines if a shareholder is eligible for a distribution.
     * @param shareholder Address of the shareholder.
     * @return Whether the shareholder should receive a distribution.
	 */
    function shouldDistribute(address shareholder) private view returns (bool) {
        return (shareholderClaims[shareholder] + minPeriod) < block.timestamp && getUnpaidEarnings(shareholder) > minDistribution;
    }
	
	/**
     * @notice Distributes available earnings to a shareholder.
     * @param shareholder Address to distribute to.
     */
    function distributeDividend(address shareholder) private {
        if(shares[shareholder].amount == 0){ return; }
		
        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0) 
		{
			IERC20(rewardToken).transfer(shareholder, amount);
			totalDistributed += amount;
			shareholderClaims[shareholder] = block.timestamp;
			shares[shareholder].totalRealised = shares[shareholder].totalRealised + amount;
			shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
			emit DividendDistributed(shareholder, amount);
        }
    }
	
	/**
     * @notice Claims available dividends for the sender.
     * @dev Protected by nonReentrant to avoid recursive distribution.
     */
    function claimReward() external nonReentrant {
	   if(shouldDistribute(msg.sender)) 
	   {
		  distributeDividend(msg.sender);
	   }
    }
	
	/**
     * @notice Calculates unpaid earnings for a shareholder.
     * @param shareholder Address of the shareholder.
     * @return The amount of unpaid earnings.
     */
    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }
        return shareholderTotalDividends - shareholderTotalExcluded;
    }

	/**
     * @notice Calculates the total dividends for a given amount of shares.
     * @param share The number of shares.
     * @return The total cumulative dividends for those shares.
     */
    function getCumulativeDividends(uint256 share) private view returns (uint256) {
        return share * dividendsPerShare / dividendsPerShareAccuracyFactor;
    }

	/**
     * @notice Adds a shareholder to the list.
     * @param shareholder Address to add.
    */
    function addShareholder(address shareholder) private {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }
	
	/**
     * @notice Removes a shareholder from the list.
     * @param shareholder Address to remove.
    */
    function removeShareholder(address shareholder) private {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
	
	/**
	 * @notice Adds liquidity to PulseX with ERC20 tokens (Token + INC)
	 * @param liqudityToken Amount of this token to add
	 * @param liqudityShare Amount of INC to pair with tokens
	*/
	function addLiquidity(uint256 liqudityToken, uint256 liqudityShare) external onlyOwner {
		IERC20(owner).approve(address(pulsexRouter), liqudityToken);
		IERC20(rewardToken).approve(address(pulsexRouter), liqudityShare);
		
		try pulsexRouter.addLiquidity(
			address(owner),
			address(rewardToken),
			liqudityToken,
			liqudityShare,
			0,
			0,
			address(this),
			block.timestamp
		) {} catch {}
	}
}

// File: IRS/IRS.sol

pragma solidity 0.8.20;






/// @title IRS Token Contract
/// @author 
/// @notice Custom ERC20 token with auto liquidity, reward distribution, and fee mechanisms on PulseChain
/// @dev Uses PulseXRouter for swaps and liquidity. Rewards distributed via custom Distributor contract.
contract IRS is Ownable, ERC20 {

	/// @notice Fee taken for reward distribution
	uint256 public immutable rewardFee;
	
	/// @notice Fee taken for burning
	uint256 public immutable burnFee;
	
	/// @notice Fee taken for adding liquidity
	uint256 public immutable liquidityFee;
	
	/// @notice Total fee that gets swapped (liquidity + reward)
	uint256 private immutable swappableFee;
	
	/// @notice Denominator for fee calculation (e.g. 10000 for basis points)
	uint256 private immutable divider;
	
	/// @notice Denominator for share calculation (e.g. 100 for basis points)
	uint256 private immutable shareDivider;

	/// @notice Gas limit for reward distributor processing
	uint256 public distributorGas;
	
	/// @notice Minimum token threshold before swap and liquify
	uint256 public swapThreshold;
	
	/// @notice Flag indicating if the contract is currently performing a swap
	bool private swapping;
	
	/// @notice Whether trading is enabled
	bool public tradingEnabled;
	
	/// @notice Whether reward distribution is enabled
	bool public distributionEnabled;
	
	/// @notice List of recognized liquidity pair addressess
	address[] public liquidityPairs;
	
	/// @notice Address to which burned tokens are sent
	address public immutable burnWallet;
	
	/// @notice INC address
	address public immutable INCContract;
	
	/// @notice Main PulseX pair address
	address public immutable pulsexPair;
	
	/// @notice PulseX Router interface
	IPulseXRouter public immutable pulsexRouter;
	
	/// @notice Custom reward distributor instance
	Distributor public rewardDistributor;
	
	/// @notice Wallets excluded from fees
    mapping(address => bool) public isExcludedFromFee;
	
	/// @notice Wallets excluded from rewards
    mapping(address => bool) public isExcludedFromReward;
	
	/// @notice Mapping for identifying liquidity pair addresses
	mapping(address => bool) public isLiquidityPair;
	
	/// @notice Shares for each LP pair in the reward calculation
	mapping(address => uint256) public liquidityPairShare;
	
	/// @notice Emitted when the swap threshold is updated
	event SwapThresholdUpdated(uint256 amount);

    /// @notice Emitted when a liquidity pair is added or removed
	event LPPairUpdated(address indexed pair, bool status);

    /// @notice Emitted when a wallet is excluded or included in fees
	event WalletExcludeFromFee(address indexed wallet, bool status);

    /// @notice Emitted when a wallet is excluded or included in rewards
	event WalletExcludedFromReward(address indexed wallet, bool value);

    /// @notice Emitted when reward distribution criteria are updated
	event DistributionCriteriaUpdated(uint256 minPeriod, uint256 minDistribution);

    /// @notice Emitted when the gas limit for distributor is updated
	event DistributorGasUpdated(uint256 distributorGas);

    /// @notice Emitted when trading is enabled
	event TradingEnabled();

    /// @notice Emitted when swapping tokens for INC fails
	event SwapFailed(uint256 tokenAmount);
	
	/// @notice Emitted when reward distribution is enabled or disabled
	event DistributionStatusUpdated(bool status);
	
	/// @notice Emitted when lp share update
	event LPPairShareUpdated(address indexed pair, uint256 newShare);
	
	/// @notice Constructor to initialize token and setup fees, LP, and exclusions
	constructor() ERC20("INC Reward Service", "IRS") {
	
		INCContract = address(0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d);
		pulsexRouter = IPulseXRouter(0x165C3410fC91EF562C50559f7d2289fEbed552d9);
		pulsexPair = IPulseXFactory(pulsexRouter.factory()).createPair(address(this), INCContract);
		rewardDistributor = new Distributor(0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d, 0x165C3410fC91EF562C50559f7d2289fEbed552d9);
		burnWallet = address(0x0000000000000000000000000000000000000369);
	
		distributionEnabled = true;
		
		rewardFee = 350;
		burnFee = 50;
		liquidityFee = 100;
		swappableFee = (rewardFee + liquidityFee);
		divider = 10000;
		shareDivider = 100;
		
		distributorGas = 250000;
		swapThreshold = 2_000_000 * (10**18);
		
		isLiquidityPair[address(pulsexPair)] = true;
	   
		isExcludedFromFee[address(msg.sender)] = true;
		isExcludedFromFee[address(this)] = true;
		isExcludedFromFee[address(burnWallet)] = true;
	   
		isExcludedFromReward[address(this)] = true;
		isExcludedFromReward[address(pulsexPair)] = true;
		isExcludedFromReward[address(burnWallet)] = true;
		
		liquidityPairs.push(pulsexPair);
		_mint(address(msg.sender), 1_555_369_000_000 * (10**18));
    }
	
	/// @notice Allows the contract to receive native PLS
	receive() external payable {}
	
	/// @notice Updates the minimum token amount before swap is triggered
    /// @param _amount New threshold in token units
	function updateSwapThreshold(uint256 _amount) external onlyOwner {
  	    require(_amount <= totalSupply(), "Amount cannot be over the total supply.");
		require(_amount >= 1000 * (10**18), "Minimum `1000` token per swap required");
		
		swapThreshold = _amount;
		emit SwapThresholdUpdated(_amount);
  	}
	
	/// @notice Excludes or includes a wallet from paying fees
    /// @param _wallet Address of the wallet
    /// @param _status True to exclude, false to include
	function excludeWalletFromFee(address _wallet, bool _status) external onlyOwner {
        require(_wallet != address(0), "Wallet address is not correct");
		require(isExcludedFromFee[_wallet] != _status, "Wallet is already the value of 'status'");
		
		isExcludedFromFee[_wallet] = _status;
		emit WalletExcludeFromFee(_wallet, _status);
    }
	
	/// @notice Enables token trading
	function enableTrading() external onlyOwner {
		require(!tradingEnabled, "Trading already enabled");
		
		tradingEnabled = true;
		emit TradingEnabled();
	}
	
	/// @notice Excludes or includes a wallet from receiving rewards
    /// @param _wallet Address of the wallet
    /// @param _status True to exclude, false to include
	function excludeWalletFromReward(address _wallet, bool _status) external onlyOwner {
	    require(_wallet != address(0), "Zero address");
	    require(isExcludedFromReward[_wallet] != _status, "Wallet is already the value of 'status'");
		
	    isExcludedFromReward[_wallet] = _status;
		if(_status) {
			try rewardDistributor.setShare(_wallet, 0) {} catch {}
        } else {
			_updateShares(_wallet);
        }
	    emit WalletExcludedFromReward(_wallet, _status);
	}
	
	/// @notice Sets the reward distribution timing and minimum thresholds
    /// @param _minPeriod Minimum time between distributions
    /// @param _minDistribution Minimum token amount required for a distribution
	function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external onlyOwner {
	    require(_minDistribution > 0, "Min. distribution can't be zero");
		
        try rewardDistributor.setDistributionCriteria(_minPeriod, _minDistribution) {} catch {}
		emit DistributionCriteriaUpdated(_minPeriod, _minDistribution);
    }
	
	/// @notice Sets the gas limit for the distributor
    /// @param _gas New gas limit
	function setDistributorGas(uint256 _gas) external onlyOwner {
       require(_gas < 750000, "Gas is greater than limit");
	   
       distributorGas = _gas;
	   emit DistributorGasUpdated(_gas);
    }
	
	/// @notice Enables or disables reward distribution
	/// @param status True to enable, false to disable
	function setDistributionStatus(bool status) external onlyOwner {
		distributionEnabled = status;
		emit DistributionStatusUpdated(status);
	}
	
	/// @notice Adds or removes a liquidity pair
    /// @param _pair The LP token address
    /// @param _status True to add, false to remove
    /// @param _share The share of the LP in reward calculations (basis points)
	function setLiquidityPair(address _pair, bool _status, uint256 _share) external onlyOwner {
        require(isLiquidityPair[_pair] != _status, "Pair is already set to that status");
		require(_pair != address(pulsexPair), "Can't update the status of main pair");
		
		if(_status)
		{
			require(isValidLiquidityPair(_pair), "Invalid liquidity pair");
			require(_share > 0, "Share must be greater than zero");
			
			liquidityPairs.push(_pair);
			isLiquidityPair[_pair] = _status;
			isExcludedFromReward[_pair] = _status;
			liquidityPairShare[_pair] = _share;
		}
		else if(isLiquidityPair[_pair])
		{
			for (uint256 i = 0; i < liquidityPairs.length; i++) {
				if (liquidityPairs[i] == _pair) {
					liquidityPairs[i] = liquidityPairs[liquidityPairs.length - 1];
					liquidityPairs.pop();
					break;
				}
			}
			liquidityPairShare[_pair] = 0;
			isLiquidityPair[_pair] = _status;
			isExcludedFromReward[_pair] = _status;
		}
		emit LPPairUpdated(_pair, _status);
    }
	
	/// @notice Updates the share of an existing liquidity pair
	/// @param _pair The LP token address
	/// @param _newShare The new share value in basis points (must be > 0)
	function updateLiquidityPairShare(address _pair, uint256 _newShare) external onlyOwner {
		require(isLiquidityPair[_pair], "Not a registered liquidity pair");
		require(_newShare > 0, "Share must be greater than zero");

		liquidityPairShare[_pair] = _newShare;
		emit LPPairShareUpdated(_pair, _newShare);
	}
	
	/// @notice Checks if the address is a valid LP pair (includes this token)
    /// @param _pair The LP token address
    /// @return Whether the pair is valid
	function isValidLiquidityPair(address _pair) private view returns (bool) {
		try IPulseXPair(_pair).token0() returns (address token0) {
			address token1 = IPulseXPair(_pair).token1();
			return (token0 == address(this) || token1 == address(this));
		} catch {
			return false;
		}
	}
	
	/// @dev Overridden ERC20 transfer to handle fee collection, swapping, and reward tracking
	function _transfer(address _sender, address _recipient, uint256 _amount) internal override(ERC20) {      
		if (!tradingEnabled) {
			require(_sender == owner() || _recipient == owner(), "Trading not enabled");
		}
		
		if(!swapping && isLiquidityPair[_recipient])  {
			uint256 contractTokenBalance = balanceOf(address(this));
			if(contractTokenBalance >= swapThreshold) {
				swapping = true;
				
				uint256 liqudityToken = (((swapThreshold * liquidityFee) / (swappableFee)) / (2));
				uint256 rewardToken = ((swapThreshold * rewardFee) / (swappableFee));
				uint256 swapToken = (liqudityToken + rewardToken);
				
				uint256 OldBalance = IERC20(INCContract).balanceOf(address(rewardDistributor));
				swapTokensForINC(swapToken);
				uint256 newBalance = IERC20(INCContract).balanceOf(address(rewardDistributor)) - (OldBalance);
				
				uint256 liqudityShare = (newBalance * liqudityToken) / (swapToken);
				uint256 rewardShare = (newBalance - liqudityShare);
				
				if(liqudityShare > 0) {
					super._transfer(address(this), address(rewardDistributor), liqudityToken);
					try rewardDistributor.addLiquidity(liqudityToken, liqudityShare) {} catch {}
				} 
				if(rewardShare > 0) {
					try rewardDistributor.deposit(rewardShare) {} catch {}
				}
				swapping = false;
			}
        }
		
		if(isExcludedFromFee[_sender] || isExcludedFromFee[_recipient] || (!isLiquidityPair[_sender] && !isLiquidityPair[_recipient])) {
			super._transfer(_sender, _recipient, _amount);
		} else {
		    (uint256 _burnFee, uint256 _swappableFee) = collectFee(_amount);
		    if(_swappableFee > 0) {
				super._transfer(_sender, address(this), _swappableFee);
		    }
			if(_burnFee > 0) {
				super._transfer(_sender, address(burnWallet), _burnFee);
		    }
			super._transfer(_sender, _recipient, (_amount - (_swappableFee + _burnFee)));
		}
		if(!isExcludedFromReward[_sender]){ _updateShares(_sender); }
        if(!isExcludedFromReward[_recipient]){ _updateShares(_recipient); }
		if(distributionEnabled){
			try rewardDistributor.process(distributorGas) {} catch {}
		}
    }
	
	/// @notice Updates reward shares for a holder
    /// @param _holder Address of the token or LP holder
	function _updateShares(address _holder) private {
		if (isExcludedFromReward[_holder]) return;
		
		uint256 totalBalance = balanceOf(_holder);
		
		for (uint256 i = 0; i < liquidityPairs.length; i++)  {
			address pair = liquidityPairs[i];
			totalBalance += (((IERC20(pair).balanceOf(_holder) * liquidityPairShare[pair])) / (shareDivider));
		}
		try rewardDistributor.setShare(_holder, totalBalance) {} catch {}
	}
	
	/// @notice Calculates burn and other fee from the amount
    /// @param _amount Token amount
    /// @return burn fee and other fees in tokens
	function collectFee(uint256 _amount) private view returns  (uint256, uint256) {
		uint256 _rewardFee = (_amount * rewardFee) / (divider);
		uint256 _liquidityFee = (_amount * liquidityFee) / (divider);
		uint256 _burnFee = (_amount * burnFee) / (divider);
		
        return (_burnFee, (_rewardFee + _liquidityFee));
    }
	
	/// @notice Swaps tokens to INC via PulseX
    /// @param _tokenAmount Amount of tokens to swap
	function swapTokensForINC(uint256 _tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
		path[1] = INCContract;
		
        _approve(address(this), address(pulsexRouter), _tokenAmount);
        try pulsexRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            path,
            address(rewardDistributor),
            block.timestamp
        ){} catch {
			emit SwapFailed(_tokenAmount);
		}
    }

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"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":"DistributionCriteriaUpdated","inputs":[{"type":"uint256","name":"minPeriod","internalType":"uint256","indexed":false},{"type":"uint256","name":"minDistribution","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DistributionStatusUpdated","inputs":[{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"DistributorGasUpdated","inputs":[{"type":"uint256","name":"distributorGas","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LPPairShareUpdated","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"uint256","name":"newShare","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LPPairUpdated","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapFailed","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapThresholdUpdated","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TradingEnabled","inputs":[],"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":"WalletExcludeFromFee","inputs":[{"type":"address","name":"wallet","internalType":"address","indexed":true},{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"WalletExcludedFromReward","inputs":[{"type":"address","name":"wallet","internalType":"address","indexed":true},{"type":"bool","name":"value","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"INCContract","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":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"burnWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"distributionEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"distributorGas","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableTrading","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeWalletFromFee","inputs":[{"type":"address","name":"_wallet","internalType":"address"},{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeWalletFromReward","inputs":[{"type":"address","name":"_wallet","internalType":"address"},{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLiquidityPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityPairShare","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"liquidityPairs","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pulsexPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXRouter"}],"name":"pulsexRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract Distributor"}],"name":"rewardDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rewardFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionStatus","inputs":[{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorGas","inputs":[{"type":"uint256","name":"_gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidityPair","inputs":[{"type":"address","name":"_pair","internalType":"address"},{"type":"bool","name":"_status","internalType":"bool"},{"type":"uint256","name":"_share","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tradingEnabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","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":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLiquidityPairShare","inputs":[{"type":"address","name":"_pair","internalType":"address"},{"type":"uint256","name":"_newShare","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSwapThreshold","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x6101c060405234801562000011575f80fd5b5060405180604001604052806012815260200171494e4320526577617264205365727669636560701b8152506040518060400160405280600381526020016249525360e81b815250620000736200006d6200038b60201b60201c565b6200038f565b600462000081838262000575565b50600562000090828262000575565b5050732fa878ab3f87cc1c9737fc071108f904c0b0c95d610160525073165c3410fc91ef562c50559f7d2289febed552d96101a08190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000101573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200012791906200063d565b610160516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af115801562000177573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200019d91906200063d565b6001600160a01b031661018052604051732fa878ab3f87cc1c9737fc071108f904c0b0c95d9073165c3410fc91ef562c50559f7d2289febed552d990620001e490620004c8565b6001600160a01b03928316815291166020820152604001604051809103905ff08015801562000215573d5f803e3d5ffd5b50600a80546001600160a01b03929092166001600160a01b0319909216919091179055610369610140526008805462ff000019166201000017905561015e6080819052603260a052606460c08190526200026f916200066c565b60e052612710610100526064610120526203d0906006556a01a784379d99db42000000600755610180516001600160a01b039081165f818152600d602090815260408083208054600160ff19918216811790925533808652600b85528386208054831684179055308087528487208054841685179055610140519098168087528487208054841685179055978652600c90945282852080548216831790558585528285208054821683179055958452908320805490951681179094556009805494850181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90920180546001600160a01b031916909117905562000385906c13a1ab1508d490547a49000000620003de565b62000692565b3390565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620004395760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060035f8282546200044c91906200066c565b90915550506001600160a01b0382165f90815260016020526040812080548392906200047a9084906200066c565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b6111b28062002f8783390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620004ff57607f821691505b6020821081036200051e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620004c3575f81815260208120601f850160051c810160208610156200054c5750805b601f850160051c820191505b818110156200056d5782815560010162000558565b505050505050565b81516001600160401b03811115620005915762000591620004d6565b620005a981620005a28454620004ea565b8462000524565b602080601f831160018114620005df575f8415620005c75750858301515b5f19600386901b1c1916600185901b1785556200056d565b5f85815260208120601f198616915b828110156200060f57888601518255948401946001909101908401620005ee565b50858210156200062d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156200064e575f80fd5b81516001600160a01b038116811462000665575f80fd5b9392505050565b808201808211156200068c57634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a05161281c6200076b5f395f81816106fa01528181612059015261209801525f8181610449015261103701525f81816104aa015281816118dc01528181611978015261200101525f818161027a0152611bc401525f611db901525f818161230d0152818161236501526123bd01525f81816117ed015261185101525f818161066a01528181611813015261238901525f81816107c801526123e101525f8181610607015281816118720152612331015261281c5ff3fe608060405260043610610236575f3560e01c806370a0823111610129578063a457c2d7116100a8578063dd62ed3e1161006d578063dd62ed3e1461073b578063f0f2c9ef1461075a578063f2fde38b14610779578063f9a580f814610798578063fce589d8146107b7575f80fd5b8063a457c2d71461068c578063a9059cbb146106ab578063acc2166a146106ca578063b9b6f9b6146106e9578063cc274b291461071c575f80fd5b80638a8c523c116100ee5780638a8c523c146105e25780638b424267146105f65780638da5cb5b1461062957806395d89b411461064557806398118cb414610659575f80fd5b806370a082311461052e578063715018a6146105625780637803deaa14610576578063866083261461059557806388f82020146105b4575f80fd5b80632d48e896116101b55780635342acb41161017a5780635342acb41461046b578063540b3f20146104995780635c9a05b8146104cc57806360e71962146104fa57806364dfd2031461050f575f80fd5b80632d48e896146103c1578063313ce567146103e057806339509351146103fb5780634ada218b1461041a5780634c62f09314610438575f80fd5b806318160ddd116101fb57806318160ddd146103255780631b7a1fb2146103395780631ba765401461035857806323b872dd14610383578063244ce7db146103a2575f80fd5b80630445b66714610241578063062287491461026957806306fdde03146102b4578063095ea7b3146102d55780630a2d140c14610304575f80fd5b3661023d57005b5f80fd5b34801561024c575f80fd5b5061025660075481565b6040519081526020015b60405180910390f35b348015610274575f80fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610260565b3480156102bf575f80fd5b506102c86107ea565b6040516102609190612429565b3480156102e0575f80fd5b506102f46102ef366004612488565b61087a565b6040519015158152602001610260565b34801561030f575f80fd5b5061032361031e3660046124c1565b610893565b005b348015610330575f80fd5b50600354610256565b348015610344575f80fd5b5061029c6103533660046124e1565b6108f1565b348015610363575f80fd5b506102566103723660046124f8565b600e6020525f908152604090205481565b34801561038e575f80fd5b506102f461039d366004612513565b610919565b3480156103ad575f80fd5b506103236103bc3660046124e1565b61093c565b3480156103cc575f80fd5b506103236103db366004612551565b6109d0565b3480156103eb575f80fd5b5060405160128152602001610260565b348015610406575f80fd5b506102f4610415366004612488565b610ac0565b348015610425575f80fd5b506008546102f490610100900460ff1681565b348015610443575f80fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b348015610476575f80fd5b506102f46104853660046124f8565b600b6020525f908152604090205460ff1681565b3480156104a4575f80fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d7575f80fd5b506102f46104e63660046124f8565b600d6020525f908152604090205460ff1681565b348015610505575f80fd5b5061025660065481565b34801561051a575f80fd5b50610323610529366004612571565b610ae1565b348015610539575f80fd5b506102566105483660046124f8565b6001600160a01b03165f9081526001602052604090205490565b34801561056d575f80fd5b50610323610bdd565b348015610581575f80fd5b50610323610590366004612571565b610bf0565b3480156105a0575f80fd5b506008546102f49062010000900460ff1681565b3480156105bf575f80fd5b506102f46105ce3660046124f8565b600c6020525f908152604090205460ff1681565b3480156105ed575f80fd5b50610323610d53565b348015610601575f80fd5b506102567f000000000000000000000000000000000000000000000000000000000000000081565b348015610634575f80fd5b505f546001600160a01b031661029c565b348015610650575f80fd5b506102c8610dec565b348015610664575f80fd5b506102567f000000000000000000000000000000000000000000000000000000000000000081565b348015610697575f80fd5b506102f46106a6366004612488565b610dfb565b3480156106b6575f80fd5b506102f46106c5366004612488565b610e75565b3480156106d5575f80fd5b50600a5461029c906001600160a01b031681565b3480156106f4575f80fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b348015610727575f80fd5b506103236107363660046124e1565b610e82565b348015610746575f80fd5b506102566107553660046125a4565b610f89565b348015610765575f80fd5b506103236107743660046125db565b610fb3565b348015610784575f80fd5b506103236107933660046124f8565b6113a0565b3480156107a3575f80fd5b506103236107b2366004612488565b611419565b3480156107c2575f80fd5b506102567f000000000000000000000000000000000000000000000000000000000000000081565b6060600480546107f990612616565b80601f016020809104026020016040519081016040528092919081815260200182805461082590612616565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f33610887818585611523565b60019150505b92915050565b61089b611646565b60088054821515620100000262ff0000199091161790556040517fb38aef214af8a01121ddda7dd915117d0bbe821c96b4ab3915f4cee420bb54d9906108e690831515815260200190565b60405180910390a150565b60098181548110610900575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f3361092685828561169f565b610931858585611717565b506001949350505050565b610944611646565b620b71b0811061099b5760405162461bcd60e51b815260206004820152601960248201527f4761732069732067726561746572207468616e206c696d69740000000000000060448201526064015b60405180910390fd5b60068190556040518181527f5f0cf7d11c1aaf2b53b91892382eaee789338051f9fcecf528ca006d062bfba8906020016108e6565b6109d8611646565b5f8111610a275760405162461bcd60e51b815260206004820152601f60248201527f4d696e2e20646973747269627574696f6e2063616e2774206265207a65726f006044820152606401610992565b600a546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015f604051808303815f87803b158015610a71575f80fd5b505af1925050508015610a82575060015b5060408051838152602081018390527f4bee245ad45dacfa3feb4cc8a61ace735c47b485fb8a399ce9e3f6c87aade418910160405180910390a15050565b5f33610887818585610ad28383610f89565b610adc9190612662565b611523565b610ae9611646565b6001600160a01b038216610b3f5760405162461bcd60e51b815260206004820152601d60248201527f57616c6c65742061646472657373206973206e6f7420636f72726563740000006044820152606401610992565b6001600160a01b0382165f908152600b602052604090205481151560ff909116151503610b7e5760405162461bcd60e51b815260040161099290612675565b6001600160a01b0382165f818152600b6020908152604091829020805460ff191685151590811790915591519182527f793188c766da601299dd85f7f21348a41b2cb4cadf893f2155f210d64fc049b891015b60405180910390a25050565b610be5611646565b610bee5f611cce565b565b610bf8611646565b6001600160a01b038216610c3d5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610992565b6001600160a01b0382165f908152600c602052604090205481151560ff909116151503610c7c5760405162461bcd60e51b815260040161099290612675565b6001600160a01b0382165f908152600c60205260409020805460ff19168215801591909117909155610d0d57600a54604051630a5b654b60e11b81526001600160a01b0384811660048301525f6024830152909116906314b6ca96906044015f604051808303815f87803b158015610cf2575f80fd5b505af1925050508015610d03575060015b15610d1657610d16565b610d1682611d1d565b816001600160a01b03167f21dfac5ff6a7cc530320d4cb002a96edf0c323b87dbe9eb9a4c39a5c3a62cbb982604051610bd1911515815260200190565b610d5b611646565b600854610100900460ff1615610db35760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610992565b6008805461ff0019166101001790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c7905f90a1565b6060600580546107f990612616565b5f3381610e088286610f89565b905083811015610e685760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610992565b6109318286868403611523565b5f33610887818585611717565b610e8a611646565b600354811115610eec5760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b6064820152608401610992565b683635c9adc5dea00000811015610f545760405162461bcd60e51b815260206004820152602660248201527f4d696e696d756d2060313030306020746f6b656e2070657220737761702072656044820152651c5d5a5c995960d21b6064820152608401610992565b60078190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd06476906020016108e6565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b610fbb611646565b6001600160a01b0383165f908152600d602052604090205482151560ff9091161515036110355760405162461bcd60e51b815260206004820152602260248201527f5061697220697320616c72656164792073657420746f20746861742073746174604482015261757360f01b6064820152608401610992565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036110c25760405162461bcd60e51b8152602060048201526024808201527f43616e2774207570646174652074686520737461747573206f66206d61696e206044820152633830b4b960e11b6064820152608401610992565b81156111ef576110d183611eb7565b6111165760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103634b8bab4b234ba3c903830b4b960511b6044820152606401610992565b5f81116111655760405162461bcd60e51b815260206004820152601f60248201527f5368617265206d7573742062652067726561746572207468616e207a65726f006044820152606401610992565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0385166001600160a01b031990911681179091555f908152600d60209081526040808320805486151560ff199182168117909255600c845282852080549091169091179055600e9091529020819055611356565b6001600160a01b0383165f908152600d602052604090205460ff1615611356575f5b60095481101561130f57836001600160a01b031660098281548110611238576112386126bc565b5f918252602090912001546001600160a01b0316036112fd5760098054611261906001906126d0565b81548110611271576112716126bc565b5f91825260209091200154600980546001600160a01b03909216918390811061129c5761129c6126bc565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060098054806112d8576112d86126e3565b5f8281526020902081015f1990810180546001600160a01b031916905501905561130f565b80611307816126f7565b915050611211565b506001600160a01b0383165f908152600e60209081526040808320839055600d8252808320805486151560ff199182168117909255600c9093529220805490911690911790555b826001600160a01b03167f4bf69fee59f1751bf6064f46595c52d722796b529aca2b5a7b6d1ac6a8f8b03183604051611393911515815260200190565b60405180910390a2505050565b6113a8611646565b6001600160a01b03811661140d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610992565b61141681611cce565b50565b611421611646565b6001600160a01b0382165f908152600d602052604090205460ff166114885760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420612072656769737465726564206c69717569646974792070616972006044820152606401610992565b5f81116114d75760405162461bcd60e51b815260206004820152601f60248201527f5368617265206d7573742062652067726561746572207468616e207a65726f006044820152606401610992565b6001600160a01b0382165f818152600e602052604090819020839055517fd678ae6319b7a48589104de503993168ab3f547fddc47d3e725f3062325414f190610bd19084815260200190565b6001600160a01b0383166115855760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610992565b6001600160a01b0382166115e65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610992565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f546001600160a01b03163314610bee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610992565b5f6116aa8484610f89565b90505f19811461171157818110156117045760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610992565b6117118484848403611523565b50505050565b600854610100900460ff1661178f575f546001600160a01b038481169116148061174d57505f546001600160a01b038381169116145b61178f5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b6044820152606401610992565b60085460ff161580156117b957506001600160a01b0382165f908152600d602052604090205460ff165b15611aff57305f908152600160205260409020546007548110611afd576008805460ff191660011790556007545f906002907f000000000000000000000000000000000000000000000000000000000000000090611838907f00000000000000000000000000000000000000000000000000000000000000009061270f565b6118429190612726565b61184c9190612726565b90505f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060075461189e919061270f565b6118a89190612726565b90505f6118b58284612662565b600a546040516370a0823160e01b81526001600160a01b0391821660048201529192505f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611923573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119479190612745565b905061195282611fac565b600a546040516370a0823160e01b81526001600160a01b0391821660048201525f9183917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156119bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e39190612745565b6119ed91906126d0565b90505f836119fb878461270f565b611a059190612726565b90505f611a1282846126d0565b90508115611a8f57600a54611a329030906001600160a01b03168961213c565b600a54604051634e6a20ed60e11b815260048101899052602481018490526001600160a01b0390911690639cd441da906044015f604051808303815f87803b158015611a7c575f80fd5b505af1925050508015611a8d575060015b505b8015611aeb57600a5460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f25906024015f604051808303815f87803b158015611ad8575f80fd5b505af1925050508015611ae9575060015b505b50506008805460ff1916905550505050505b505b6001600160a01b0383165f908152600b602052604090205460ff1680611b3c57506001600160a01b0382165f908152600b602052604090205460ff165b80611b8257506001600160a01b0383165f908152600d602052604090205460ff16158015611b8257506001600160a01b0382165f908152600d602052604090205460ff16155b15611b9757611b9283838361213c565b611c0a565b5f80611ba283612308565b90925090508015611bb857611bb885308361213c565b8115611be957611be9857f00000000000000000000000000000000000000000000000000000000000000008461213c565b611c078585611bf88585612662565b611c0290876126d0565b61213c565b50505b6001600160a01b0383165f908152600c602052604090205460ff16611c3257611c3283611d1d565b6001600160a01b0382165f908152600c602052604090205460ff16611c5a57611c5a82611d1d565b60085462010000900460ff1615611cc957600a546006546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611ca39160040190815260200190565b5f604051808303815f87803b158015611cba575f80fd5b505af192505050801561171157505b505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381165f908152600c602052604090205460ff1615611d405750565b6001600160a01b0381165f90815260016020526040812054905b600954811015611e58575f60098281548110611d7857611d786126bc565b5f918252602080832091909101546001600160a01b03908116808452600e9092526040928390205492516370a0823160e01b815290871660048201529092507f0000000000000000000000000000000000000000000000000000000000000000919083906370a0823190602401602060405180830381865afa158015611e00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e249190612745565b611e2e919061270f565b611e389190612726565b611e429084612662565b9250508080611e50906126f7565b915050611d5a565b50600a54604051630a5b654b60e11b81526001600160a01b03848116600483015260248201849052909116906314b6ca96906044015f604051808303815f87803b158015611ea4575f80fd5b505af1925050508015611cc957505b5050565b5f816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f12575060408051601f3d908101601f19168201909252611f0f9181019061275c565b60015b611f1d57505f919050565b5f836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f7e919061275c565b90506001600160a01b038216301480611f9f57506001600160a01b03811630145b949350505050565b919050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611fdf57611fdf6126bc565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612033576120336126bc565b60200260200101906001600160a01b031690816001600160a01b03168152505061207e307f000000000000000000000000000000000000000000000000000000000000000084611523565b600a54604051635c11d79560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692635c11d795926120d99287925f92889291909116904290600401612777565b5f604051808303815f87803b1580156120f0575f80fd5b505af1925050508015612101575060015b611eb3576040518281527ff9e10ddceffcb10b96e8833202366240699b814c91f371ddd9befa3aee9bc60f9060200160405180910390a15050565b6001600160a01b0383166121a05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610992565b6001600160a01b0382166122025760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610992565b6001600160a01b0383165f90815260016020526040902054818110156122795760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610992565b6001600160a01b038085165f908152600160205260408082208585039055918516815290812080548492906122af908490612662565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122fb91815260200190565b60405180910390a3611711565b5f80807f00000000000000000000000000000000000000000000000000000000000000006123567f00000000000000000000000000000000000000000000000000000000000000008661270f565b6123609190612726565b90505f7f00000000000000000000000000000000000000000000000000000000000000006123ae7f00000000000000000000000000000000000000000000000000000000000000008761270f565b6123b89190612726565b90505f7f00000000000000000000000000000000000000000000000000000000000000006124067f00000000000000000000000000000000000000000000000000000000000000008861270f565b6124109190612726565b90508061241d8385612662565b94509450505050915091565b5f6020808352835180828501525f5b8181101561245457858101830151858201604001528201612438565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611416575f80fd5b5f8060408385031215612499575f80fd5b82356124a481612474565b946020939093013593505050565b80358015158114611fa7575f80fd5b5f602082840312156124d1575f80fd5b6124da826124b2565b9392505050565b5f602082840312156124f1575f80fd5b5035919050565b5f60208284031215612508575f80fd5b81356124da81612474565b5f805f60608486031215612525575f80fd5b833561253081612474565b9250602084013561254081612474565b929592945050506040919091013590565b5f8060408385031215612562575f80fd5b50508035926020909101359150565b5f8060408385031215612582575f80fd5b823561258d81612474565b915061259b602084016124b2565b90509250929050565b5f80604083850312156125b5575f80fd5b82356125c081612474565b915060208301356125d081612474565b809150509250929050565b5f805f606084860312156125ed575f80fd5b83356125f881612474565b9250612606602085016124b2565b9150604084013590509250925092565b600181811c9082168061262a57607f821691505b60208210810361264857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088d5761088d61264e565b60208082526027908201527f57616c6c657420697320616c7265616479207468652076616c7565206f6620276040820152667374617475732760c81b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561088d5761088d61264e565b634e487b7160e01b5f52603160045260245ffd5b5f600182016127085761270861264e565b5060010190565b808202811582820484141761088d5761088d61264e565b5f8261274057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612755575f80fd5b5051919050565b5f6020828403121561276c575f80fd5b81516124da81612474565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156127c55784516001600160a01b0316835293830193918301916001016127a0565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122071bcf9e4c86a61db4d7cd325e8ea9df0d3115c228f48fd195e7a74046030e4d864736f6c6343000814003360c06040526ec097ce7bc90715b34b9f1000000000600a55600a600b556402540be400600c55348015610030575f80fd5b506040516111b23803806111b283398101604081905261004f91610098565b60015f8190556001600160a01b03928316608052911660a05280546001600160a01b031916331790556100c9565b80516001600160a01b0381168114610093575f80fd5b919050565b5f80604083850312156100a9575f80fd5b6100b28361007d565b91506100c06020840161007d565b90509250929050565b60805160a05161109e6101145f395f81816102720152818161068401528181610716015261082001525f818161036701528181610745015281816107d10152610bf9015261109e5ff3fe608060405260043610610113575f3560e01c8063b6b55f251161009d578063e2d2e21911610062578063e2d2e2191461032c578063efca2eed14610341578063f7c618c114610356578063ffb2c47914610389578063ffd49c84146103a8575f80fd5b8063b6b55f251461022e578063b88a802f1461024d578063b9b6f9b614610261578063ce7c2ac2146102ac578063d4fda1f214610301575f80fd5b80633a98ef39116100e35780633a98ef39146101a55780634fab0ae8146101ba57806366817df5146101cf578063997664d7146101fa5780639cd441da1461020f575f80fd5b806311ce023d1461011e57806314b6ca961461014657806328fd3198146101675780632d48e89614610186575f80fd5b3661011a57005b5f80fd5b348015610129575f80fd5b50610133600a5481565b6040519081526020015b60405180910390f35b348015610151575f80fd5b50610165610160366004610eb8565b6103bd565b005b348015610172575f80fd5b50610133610181366004610ee0565b610549565b348015610191575f80fd5b506101656101a0366004610f00565b6105cf565b3480156101b0575f80fd5b5061013360065481565b3480156101c5575f80fd5b50610133600c5481565b3480156101da575f80fd5b506101336101e9366004610ee0565b60046020525f908152604090205481565b348015610205575f80fd5b5061013360075481565b34801561021a575f80fd5b50610165610229366004610f00565b610640565b348015610239575f80fd5b50610165610248366004610f20565b610895565b348015610258575f80fd5b50610165610a25565b34801561026c575f80fd5b506102947f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161013d565b3480156102b7575f80fd5b506102e66102c6366004610ee0565b60056020525f908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161013d565b34801561030c575f80fd5b5061013361031b366004610ee0565b60036020525f908152604090205481565b348015610337575f80fd5b5061013360095481565b34801561034c575f80fd5b5061013360085481565b348015610361575f80fd5b506102947f000000000000000000000000000000000000000000000000000000000000000081565b348015610394575f80fd5b506101656103a3366004610f20565b610a97565b3480156103b3575f80fd5b50610133600b5481565b6001546001600160a01b031633146103f05760405162461bcd60e51b81526004016103e790610f37565b60405180910390fd5b6001600160a01b0382165f90815260056020526040902054156104165761041682610ba0565b5f8111801561043a57506001600160a01b0382165f90815260056020526040902054155b1561049f57600280546001600160a01b0384165f818152600360205260408120839055600183018455929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03191690911790556104d1565b801580156104c357506001600160a01b0382165f9081526005602052604090205415155b156104d1576104d182610d27565b6001600160a01b0382165f9081526005602052604090205460065482916104f791610f6b565b6105019190610f7e565b6006556001600160a01b0382165f90815260056020526040902081905561052781610e37565b6001600160a01b039092165f9081526005602052604090206001019190915550565b6001600160a01b0381165f90815260056020526040812054810361056e57505f919050565b6001600160a01b0382165f9081526005602052604081205461058f90610e37565b6001600160a01b0384165f908152600560205260409020600101549091508082116105bd57505f9392505050565b6105c78183610f6b565b949350505050565b6001546001600160a01b031633146105f95760405162461bcd60e51b81526004016103e790610f37565b600b829055600c81905560408051838152602081018390527f7d38de579bb682aa05ace7e32d15f88df69a3a53f6f89fcd0236f93fcc7e6362910160405180910390a15050565b6001546001600160a01b0316331461066a5760405162461bcd60e51b81526004016103e790610f37565b60015460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590529091169063095ea7b3906044016020604051808303815f875af11580156106da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fe9190610f91565b5060405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af115801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af9190610f91565b5060015460405162e8e33760e81b81526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000008216602482015260448101849052606481018390525f6084820181905260a48201523060c48201524260e48201527f00000000000000000000000000000000000000000000000000000000000000009091169063e8e3370090610104016060604051808303815f875af1925050508015610887575060408051601f3d908101601f1916820190925261088491810190610fb0565b60015b15610891575b5050505b5050565b6001546001600160a01b031633146108bf5760405162461bcd60e51b81526004016103e790610f37565b8060075f8282546108d09190610f7e565b9091555050600654600a546108e6908390610fdb565b6108f09190610ff2565b60095f8282546109009190610f7e565b90915550506001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561094b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096f9190611011565b905080156109eb5760015460405163a9059cbb60e01b81526001600160a01b0390911660048201819052602482018390529063a9059cbb906044016020604051808303815f875af19250505080156109e4575060408051601f3d908101601f191682019092526109e191810190610f91565b60015b156109eb57505b60405182815233907f61f49175fe1d0957ca728302166505f7a310d3088ac3b748e92533f9f3458e39906020015b60405180910390a25050565b60025f5403610a765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103e7565b60025f55610a8333610e59565b15610a9157610a9133610ba0565b60015f55565b6001546001600160a01b03163314610ac15760405162461bcd60e51b81526004016103e790610f37565b6002545f819003610ad0575050565b5f805a90505f5b8483108015610ae557508381105b1561088d5783600d5410610af8575f600d555b610b296002600d5481548110610b1057610b10611028565b5f918252602090912001546001600160a01b0316610e59565b15610b5f57610b5f6002600d5481548110610b4657610b46611028565b5f918252602090912001546001600160a01b0316610ba0565b5a610b6a8385610f7e565b610b749190610f6b565b92505a600d80549193505f610b888361103c565b91905055508080610b989061103c565b915050610ad7565b6001600160a01b0381165f908152600560205260408120549003610bc15750565b5f610bcb82610549565b905080156108915760405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610c3f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c639190610f91565b508060085f828254610c759190610f7e565b90915550506001600160a01b0382165f9081526004602090815260408083204290556005909152902060020154610cad908290610f7e565b6001600160a01b0383165f908152600560205260409020600281019190915554610cd690610e37565b6001600160a01b0383165f81815260056020526040908190206001019290925590517f84fcdd4a7f507f2206dd50958e7473061bf941f91791c6ffaf74033a07c82f1290610a199084815260200190565b60028054610d3790600190610f6b565b81548110610d4757610d47611028565b5f9182526020808320909101546001600160a01b0384811684526003909252604090922054600280549290931692918110610d8457610d84611028565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260039182905260408120546002805491939291610dcf90600190610f6b565b81548110610ddf57610ddf611028565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556002805480610e1457610e14611054565b5f8281526020902081015f1990810180546001600160a01b031916905501905550565b5f600a5460095483610e499190610fdb565b610e539190610ff2565b92915050565b600b546001600160a01b0382165f9081526004602052604081205490914291610e829190610f7e565b108015610e535750600c54610e9683610549565b1192915050565b80356001600160a01b0381168114610eb3575f80fd5b919050565b5f8060408385031215610ec9575f80fd5b610ed283610e9d565b946020939093013593505050565b5f60208284031215610ef0575f80fd5b610ef982610e9d565b9392505050565b5f8060408385031215610f11575f80fd5b50508035926020909101359150565b5f60208284031215610f30575f80fd5b5035919050565b60208082526006908201526510aa37b5b2b760d11b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610e5357610e53610f57565b80820180821115610e5357610e53610f57565b5f60208284031215610fa1575f80fd5b81518015158114610ef9575f80fd5b5f805f60608486031215610fc2575f80fd5b8351925060208401519150604084015190509250925092565b8082028115828204841417610e5357610e53610f57565b5f8261100c57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611021575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161104d5761104d610f57565b5060010190565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220acce9123c3b7beb6d87724948c2a940a4169f8663c824ad48063358fa57d9bcc64736f6c63430008140033

Deployed ByteCode

0x608060405260043610610236575f3560e01c806370a0823111610129578063a457c2d7116100a8578063dd62ed3e1161006d578063dd62ed3e1461073b578063f0f2c9ef1461075a578063f2fde38b14610779578063f9a580f814610798578063fce589d8146107b7575f80fd5b8063a457c2d71461068c578063a9059cbb146106ab578063acc2166a146106ca578063b9b6f9b6146106e9578063cc274b291461071c575f80fd5b80638a8c523c116100ee5780638a8c523c146105e25780638b424267146105f65780638da5cb5b1461062957806395d89b411461064557806398118cb414610659575f80fd5b806370a082311461052e578063715018a6146105625780637803deaa14610576578063866083261461059557806388f82020146105b4575f80fd5b80632d48e896116101b55780635342acb41161017a5780635342acb41461046b578063540b3f20146104995780635c9a05b8146104cc57806360e71962146104fa57806364dfd2031461050f575f80fd5b80632d48e896146103c1578063313ce567146103e057806339509351146103fb5780634ada218b1461041a5780634c62f09314610438575f80fd5b806318160ddd116101fb57806318160ddd146103255780631b7a1fb2146103395780631ba765401461035857806323b872dd14610383578063244ce7db146103a2575f80fd5b80630445b66714610241578063062287491461026957806306fdde03146102b4578063095ea7b3146102d55780630a2d140c14610304575f80fd5b3661023d57005b5f80fd5b34801561024c575f80fd5b5061025660075481565b6040519081526020015b60405180910390f35b348015610274575f80fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000036981565b6040516001600160a01b039091168152602001610260565b3480156102bf575f80fd5b506102c86107ea565b6040516102609190612429565b3480156102e0575f80fd5b506102f46102ef366004612488565b61087a565b6040519015158152602001610260565b34801561030f575f80fd5b5061032361031e3660046124c1565b610893565b005b348015610330575f80fd5b50600354610256565b348015610344575f80fd5b5061029c6103533660046124e1565b6108f1565b348015610363575f80fd5b506102566103723660046124f8565b600e6020525f908152604090205481565b34801561038e575f80fd5b506102f461039d366004612513565b610919565b3480156103ad575f80fd5b506103236103bc3660046124e1565b61093c565b3480156103cc575f80fd5b506103236103db366004612551565b6109d0565b3480156103eb575f80fd5b5060405160128152602001610260565b348015610406575f80fd5b506102f4610415366004612488565b610ac0565b348015610425575f80fd5b506008546102f490610100900460ff1681565b348015610443575f80fd5b5061029c7f0000000000000000000000000bb845761c52eb645ccb55c6d91f6afdf549992981565b348015610476575f80fd5b506102f46104853660046124f8565b600b6020525f908152604090205460ff1681565b3480156104a4575f80fd5b5061029c7f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d81565b3480156104d7575f80fd5b506102f46104e63660046124f8565b600d6020525f908152604090205460ff1681565b348015610505575f80fd5b5061025660065481565b34801561051a575f80fd5b50610323610529366004612571565b610ae1565b348015610539575f80fd5b506102566105483660046124f8565b6001600160a01b03165f9081526001602052604090205490565b34801561056d575f80fd5b50610323610bdd565b348015610581575f80fd5b50610323610590366004612571565b610bf0565b3480156105a0575f80fd5b506008546102f49062010000900460ff1681565b3480156105bf575f80fd5b506102f46105ce3660046124f8565b600c6020525f908152604090205460ff1681565b3480156105ed575f80fd5b50610323610d53565b348015610601575f80fd5b506102567f000000000000000000000000000000000000000000000000000000000000015e81565b348015610634575f80fd5b505f546001600160a01b031661029c565b348015610650575f80fd5b506102c8610dec565b348015610664575f80fd5b506102567f000000000000000000000000000000000000000000000000000000000000006481565b348015610697575f80fd5b506102f46106a6366004612488565b610dfb565b3480156106b6575f80fd5b506102f46106c5366004612488565b610e75565b3480156106d5575f80fd5b50600a5461029c906001600160a01b031681565b3480156106f4575f80fd5b5061029c7f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d981565b348015610727575f80fd5b506103236107363660046124e1565b610e82565b348015610746575f80fd5b506102566107553660046125a4565b610f89565b348015610765575f80fd5b506103236107743660046125db565b610fb3565b348015610784575f80fd5b506103236107933660046124f8565b6113a0565b3480156107a3575f80fd5b506103236107b2366004612488565b611419565b3480156107c2575f80fd5b506102567f000000000000000000000000000000000000000000000000000000000000003281565b6060600480546107f990612616565b80601f016020809104026020016040519081016040528092919081815260200182805461082590612616565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f33610887818585611523565b60019150505b92915050565b61089b611646565b60088054821515620100000262ff0000199091161790556040517fb38aef214af8a01121ddda7dd915117d0bbe821c96b4ab3915f4cee420bb54d9906108e690831515815260200190565b60405180910390a150565b60098181548110610900575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f3361092685828561169f565b610931858585611717565b506001949350505050565b610944611646565b620b71b0811061099b5760405162461bcd60e51b815260206004820152601960248201527f4761732069732067726561746572207468616e206c696d69740000000000000060448201526064015b60405180910390fd5b60068190556040518181527f5f0cf7d11c1aaf2b53b91892382eaee789338051f9fcecf528ca006d062bfba8906020016108e6565b6109d8611646565b5f8111610a275760405162461bcd60e51b815260206004820152601f60248201527f4d696e2e20646973747269627574696f6e2063616e2774206265207a65726f006044820152606401610992565b600a546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015f604051808303815f87803b158015610a71575f80fd5b505af1925050508015610a82575060015b5060408051838152602081018390527f4bee245ad45dacfa3feb4cc8a61ace735c47b485fb8a399ce9e3f6c87aade418910160405180910390a15050565b5f33610887818585610ad28383610f89565b610adc9190612662565b611523565b610ae9611646565b6001600160a01b038216610b3f5760405162461bcd60e51b815260206004820152601d60248201527f57616c6c65742061646472657373206973206e6f7420636f72726563740000006044820152606401610992565b6001600160a01b0382165f908152600b602052604090205481151560ff909116151503610b7e5760405162461bcd60e51b815260040161099290612675565b6001600160a01b0382165f818152600b6020908152604091829020805460ff191685151590811790915591519182527f793188c766da601299dd85f7f21348a41b2cb4cadf893f2155f210d64fc049b891015b60405180910390a25050565b610be5611646565b610bee5f611cce565b565b610bf8611646565b6001600160a01b038216610c3d5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610992565b6001600160a01b0382165f908152600c602052604090205481151560ff909116151503610c7c5760405162461bcd60e51b815260040161099290612675565b6001600160a01b0382165f908152600c60205260409020805460ff19168215801591909117909155610d0d57600a54604051630a5b654b60e11b81526001600160a01b0384811660048301525f6024830152909116906314b6ca96906044015f604051808303815f87803b158015610cf2575f80fd5b505af1925050508015610d03575060015b15610d1657610d16565b610d1682611d1d565b816001600160a01b03167f21dfac5ff6a7cc530320d4cb002a96edf0c323b87dbe9eb9a4c39a5c3a62cbb982604051610bd1911515815260200190565b610d5b611646565b600854610100900460ff1615610db35760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610992565b6008805461ff0019166101001790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c7905f90a1565b6060600580546107f990612616565b5f3381610e088286610f89565b905083811015610e685760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610992565b6109318286868403611523565b5f33610887818585611717565b610e8a611646565b600354811115610eec5760405162461bcd60e51b815260206004820152602760248201527f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060448201526639bab838363c9760c91b6064820152608401610992565b683635c9adc5dea00000811015610f545760405162461bcd60e51b815260206004820152602660248201527f4d696e696d756d2060313030306020746f6b656e2070657220737761702072656044820152651c5d5a5c995960d21b6064820152608401610992565b60078190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd06476906020016108e6565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b610fbb611646565b6001600160a01b0383165f908152600d602052604090205482151560ff9091161515036110355760405162461bcd60e51b815260206004820152602260248201527f5061697220697320616c72656164792073657420746f20746861742073746174604482015261757360f01b6064820152608401610992565b7f0000000000000000000000000bb845761c52eb645ccb55c6d91f6afdf54999296001600160a01b0316836001600160a01b0316036110c25760405162461bcd60e51b8152602060048201526024808201527f43616e2774207570646174652074686520737461747573206f66206d61696e206044820152633830b4b960e11b6064820152608401610992565b81156111ef576110d183611eb7565b6111165760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103634b8bab4b234ba3c903830b4b960511b6044820152606401610992565b5f81116111655760405162461bcd60e51b815260206004820152601f60248201527f5368617265206d7573742062652067726561746572207468616e207a65726f006044820152606401610992565b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0385166001600160a01b031990911681179091555f908152600d60209081526040808320805486151560ff199182168117909255600c845282852080549091169091179055600e9091529020819055611356565b6001600160a01b0383165f908152600d602052604090205460ff1615611356575f5b60095481101561130f57836001600160a01b031660098281548110611238576112386126bc565b5f918252602090912001546001600160a01b0316036112fd5760098054611261906001906126d0565b81548110611271576112716126bc565b5f91825260209091200154600980546001600160a01b03909216918390811061129c5761129c6126bc565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060098054806112d8576112d86126e3565b5f8281526020902081015f1990810180546001600160a01b031916905501905561130f565b80611307816126f7565b915050611211565b506001600160a01b0383165f908152600e60209081526040808320839055600d8252808320805486151560ff199182168117909255600c9093529220805490911690911790555b826001600160a01b03167f4bf69fee59f1751bf6064f46595c52d722796b529aca2b5a7b6d1ac6a8f8b03183604051611393911515815260200190565b60405180910390a2505050565b6113a8611646565b6001600160a01b03811661140d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610992565b61141681611cce565b50565b611421611646565b6001600160a01b0382165f908152600d602052604090205460ff166114885760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420612072656769737465726564206c69717569646974792070616972006044820152606401610992565b5f81116114d75760405162461bcd60e51b815260206004820152601f60248201527f5368617265206d7573742062652067726561746572207468616e207a65726f006044820152606401610992565b6001600160a01b0382165f818152600e602052604090819020839055517fd678ae6319b7a48589104de503993168ab3f547fddc47d3e725f3062325414f190610bd19084815260200190565b6001600160a01b0383166115855760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610992565b6001600160a01b0382166115e65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610992565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f546001600160a01b03163314610bee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610992565b5f6116aa8484610f89565b90505f19811461171157818110156117045760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610992565b6117118484848403611523565b50505050565b600854610100900460ff1661178f575f546001600160a01b038481169116148061174d57505f546001600160a01b038381169116145b61178f5760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b6044820152606401610992565b60085460ff161580156117b957506001600160a01b0382165f908152600d602052604090205460ff165b15611aff57305f908152600160205260409020546007548110611afd576008805460ff191660011790556007545f906002907f00000000000000000000000000000000000000000000000000000000000001c290611838907f00000000000000000000000000000000000000000000000000000000000000649061270f565b6118429190612726565b61184c9190612726565b90505f7f00000000000000000000000000000000000000000000000000000000000001c27f000000000000000000000000000000000000000000000000000000000000015e60075461189e919061270f565b6118a89190612726565b90505f6118b58284612662565b600a546040516370a0823160e01b81526001600160a01b0391821660048201529192505f917f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d909116906370a0823190602401602060405180830381865afa158015611923573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119479190612745565b905061195282611fac565b600a546040516370a0823160e01b81526001600160a01b0391821660048201525f9183917f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d909116906370a0823190602401602060405180830381865afa1580156119bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e39190612745565b6119ed91906126d0565b90505f836119fb878461270f565b611a059190612726565b90505f611a1282846126d0565b90508115611a8f57600a54611a329030906001600160a01b03168961213c565b600a54604051634e6a20ed60e11b815260048101899052602481018490526001600160a01b0390911690639cd441da906044015f604051808303815f87803b158015611a7c575f80fd5b505af1925050508015611a8d575060015b505b8015611aeb57600a5460405163b6b55f2560e01b8152600481018390526001600160a01b039091169063b6b55f25906024015f604051808303815f87803b158015611ad8575f80fd5b505af1925050508015611ae9575060015b505b50506008805460ff1916905550505050505b505b6001600160a01b0383165f908152600b602052604090205460ff1680611b3c57506001600160a01b0382165f908152600b602052604090205460ff165b80611b8257506001600160a01b0383165f908152600d602052604090205460ff16158015611b8257506001600160a01b0382165f908152600d602052604090205460ff16155b15611b9757611b9283838361213c565b611c0a565b5f80611ba283612308565b90925090508015611bb857611bb885308361213c565b8115611be957611be9857f00000000000000000000000000000000000000000000000000000000000003698461213c565b611c078585611bf88585612662565b611c0290876126d0565b61213c565b50505b6001600160a01b0383165f908152600c602052604090205460ff16611c3257611c3283611d1d565b6001600160a01b0382165f908152600c602052604090205460ff16611c5a57611c5a82611d1d565b60085462010000900460ff1615611cc957600a546006546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611ca39160040190815260200190565b5f604051808303815f87803b158015611cba575f80fd5b505af192505050801561171157505b505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381165f908152600c602052604090205460ff1615611d405750565b6001600160a01b0381165f90815260016020526040812054905b600954811015611e58575f60098281548110611d7857611d786126bc565b5f918252602080832091909101546001600160a01b03908116808452600e9092526040928390205492516370a0823160e01b815290871660048201529092507f0000000000000000000000000000000000000000000000000000000000000064919083906370a0823190602401602060405180830381865afa158015611e00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e249190612745565b611e2e919061270f565b611e389190612726565b611e429084612662565b9250508080611e50906126f7565b915050611d5a565b50600a54604051630a5b654b60e11b81526001600160a01b03848116600483015260248201849052909116906314b6ca96906044015f604051808303815f87803b158015611ea4575f80fd5b505af1925050508015611cc957505b5050565b5f816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f12575060408051601f3d908101601f19168201909252611f0f9181019061275c565b60015b611f1d57505f919050565b5f836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f7e919061275c565b90506001600160a01b038216301480611f9f57506001600160a01b03811630145b949350505050565b919050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611fdf57611fdf6126bc565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d81600181518110612033576120336126bc565b60200260200101906001600160a01b031690816001600160a01b03168152505061207e307f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d984611523565b600a54604051635c11d79560e01b81526001600160a01b037f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9811692635c11d795926120d99287925f92889291909116904290600401612777565b5f604051808303815f87803b1580156120f0575f80fd5b505af1925050508015612101575060015b611eb3576040518281527ff9e10ddceffcb10b96e8833202366240699b814c91f371ddd9befa3aee9bc60f9060200160405180910390a15050565b6001600160a01b0383166121a05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610992565b6001600160a01b0382166122025760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610992565b6001600160a01b0383165f90815260016020526040902054818110156122795760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610992565b6001600160a01b038085165f908152600160205260408082208585039055918516815290812080548492906122af908490612662565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122fb91815260200190565b60405180910390a3611711565b5f80807f00000000000000000000000000000000000000000000000000000000000027106123567f000000000000000000000000000000000000000000000000000000000000015e8661270f565b6123609190612726565b90505f7f00000000000000000000000000000000000000000000000000000000000027106123ae7f00000000000000000000000000000000000000000000000000000000000000648761270f565b6123b89190612726565b90505f7f00000000000000000000000000000000000000000000000000000000000027106124067f00000000000000000000000000000000000000000000000000000000000000328861270f565b6124109190612726565b90508061241d8385612662565b94509450505050915091565b5f6020808352835180828501525f5b8181101561245457858101830151858201604001528201612438565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611416575f80fd5b5f8060408385031215612499575f80fd5b82356124a481612474565b946020939093013593505050565b80358015158114611fa7575f80fd5b5f602082840312156124d1575f80fd5b6124da826124b2565b9392505050565b5f602082840312156124f1575f80fd5b5035919050565b5f60208284031215612508575f80fd5b81356124da81612474565b5f805f60608486031215612525575f80fd5b833561253081612474565b9250602084013561254081612474565b929592945050506040919091013590565b5f8060408385031215612562575f80fd5b50508035926020909101359150565b5f8060408385031215612582575f80fd5b823561258d81612474565b915061259b602084016124b2565b90509250929050565b5f80604083850312156125b5575f80fd5b82356125c081612474565b915060208301356125d081612474565b809150509250929050565b5f805f606084860312156125ed575f80fd5b83356125f881612474565b9250612606602085016124b2565b9150604084013590509250925092565b600181811c9082168061262a57607f821691505b60208210810361264857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088d5761088d61264e565b60208082526027908201527f57616c6c657420697320616c7265616479207468652076616c7565206f6620276040820152667374617475732760c81b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561088d5761088d61264e565b634e487b7160e01b5f52603160045260245ffd5b5f600182016127085761270861264e565b5060010190565b808202811582820484141761088d5761088d61264e565b5f8261274057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612755575f80fd5b5051919050565b5f6020828403121561276c575f80fd5b81516124da81612474565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156127c55784516001600160a01b0316835293830193918301916001016127a0565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122071bcf9e4c86a61db4d7cd325e8ea9df0d3115c228f48fd195e7a74046030e4d864736f6c63430008140033