false
true
0

Contract Address Details

0xfd9601e33CAAF5d2B1E6a44B9174C68db002186F

Contract Name
PewVPLSVault
Creator
0xa62540–5ba3ab at 0x4c1d5f–4a6e46
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
18 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26319616
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
PewVPLSVault




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




Optimization runs
200
EVM Version
london




Verified at
2026-02-05T14:52:26.824168Z

PewVVault.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/* ========== ERRORS ========== */
error NotOwner();
error ZeroAddress();
error NoRewards();
error Slippage();
error BpsTooHigh();
error NativeTransferFailed();
error Cooldown();
error InvalidPath();
error NotEnoughPewpew();
error Reentrancy();
error ContractPaused();

/* ========== MINIMAL ERC20 INTERFACE ========== */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address holder, address spender) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

/* ========== PULSEX V2 ROUTER INTERFACE ========== */
interface IPulseXV2Router02 {
    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

/* ========== SIMPLE BURN VAULT ========== */
interface ISimpleBurnVault {
    function burn(address token) external;
}

/* ========== OWNABLE ========== */
abstract contract Ownable {
    address private _owner;

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

    constructor() {
        _transferOwnership(msg.sender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        if (msg.sender != _owner) revert NotOwner();
        _;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        if (newOwner == address(0)) revert ZeroAddress();
        _transferOwnership(newOwner);
    }

    function renounceOwnership() external onlyOwner {
        _transferOwnership(address(0));
    }

    function _transferOwnership(address newOwner) internal {
        address old = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(old, newOwner);
    }
}

/* ========== REENTRANCY GUARD ========== */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        if (_status == _ENTERED) revert Reentrancy();
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/* ========== PAUSABLE ========== */
abstract contract Pausable {
    bool private _paused;

    event Paused(address indexed account);
    event Unpaused(address indexed account);

    modifier whenNotPaused() {
        if (_paused) revert ContractPaused();
        _;
    }

    function _pause() internal {
        _paused = true;
        emit Paused(msg.sender);
    }

    function _unpause() internal {
        _paused = false;
        emit Unpaused(msg.sender);
    }

    function paused() public view returns (bool) {
        return _paused;
    }
}

/* ========== SAFE ERC20 HELPERS ========== */
library SafeERC20Lite {
    function safeTransfer(IERC20 token, address to, uint256 amount) internal {
        _callOptionalReturn(address(token), abi.encodeWithSelector(token.transfer.selector, to, amount));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
        _callOptionalReturn(address(token), abi.encodeWithSelector(token.transferFrom.selector, from, to, amount));
    }

    function safeApprove(IERC20 token, address spender, uint256 amount) internal {
        _callOptionalReturn(address(token), abi.encodeWithSelector(token.approve.selector, spender, amount));
    }

    function _callOptionalReturn(address token, bytes memory data) private {
        (bool ok, bytes memory ret) = token.call(data);
        require(ok, "ERC20 call failed");
        if (ret.length > 0) {
            require(abi.decode(ret, (bool)), "ERC20 op failed");
        }
    }
}

/* ========== MAIN CONTRACT ========== */
contract PewVPLSVault is Ownable, Pausable, ReentrancyGuard {
    using SafeERC20Lite for IERC20;

    uint256 private constant BPS_DENOM = 10_000;

    IERC20 public immutable VPLS;     // vault holds vPLS
    IERC20 public immutable WPLS;     // intermediate hop (optional)
    IERC20 public immutable PEWPEW;   // reward/burn token

    IPulseXV2Router02 public router;  // owner-adjustable (must stay mutable)
    ISimpleBurnVault public burnVault;

    // basis points config (out of 10_000)
    uint256 public callerRewardBps;      // default 50%
    uint256 public burnBps;              // default 50%
    uint256 public slippageBps;          // default 2%
    uint256 public vplsSwapPercentBps;   // default 0.01% (1 bps)

    uint256 public swapTimeout;          // seconds
    uint256 public harvestCooldown;      // seconds
    uint256 public lastHarvest;

    address[] public vplsToPewPath;      // [VPLS, PEWPEW] or [VPLS, WPLS, PEWPEW]
    address[] private _pewToVplsPath;    // cached reverse path for preview functions

    // PEW requirement to call harvest
    uint256 public harvestPewRequirement;

    // historical totals
    uint256 public totalCallerPaid;
    uint256 public totalBurned;

    /* ========== EVENTS ========== */
    event Harvested(
        address indexed caller,
        uint256 vplsSwapped,
        uint256 pewReceived,
        uint256 callerPaid,
        uint256 burnPaid,
        uint256 nextAvailableHarvest
    );

    event EmergencyHarvest(
        address indexed caller,
        uint256 vplsSwapped,
        uint256 pewReceived,
        uint256 burnPaid
    );

    event Deposited(address indexed token, address indexed from, uint256 amount);

    event CallerRewardUpdated(uint256 oldBps, uint256 newBps);
    event BurnBpsUpdated(uint256 oldBps, uint256 newBps);
    event SlippageUpdated(uint256 oldBps, uint256 newBps);
    event SwapPercentUpdated(uint256 oldBps, uint256 newBps);
    event SwapTimeoutUpdated(uint256 oldTimeout, uint256 newTimeout);
    event HarvestCooldownUpdated(uint256 oldCooldown, uint256 newCooldown);
    event RouterUpdated(address indexed oldRouter, address indexed newRouter);
    event PathsUpdated(address[] oldPath, address[] newPath);
    event BurnVaultUpdated(address indexed oldVault, address indexed newVault);
    event HarvestRequirementUpdated(uint256 oldRequirement, uint256 newRequirement);

    event BurnCallFailed(address indexed burnVault, address indexed token, uint256 amount);

    /* ========== RECEIVE NATIVE PLS ========== */
    receive() external payable {}

    constructor() {
        // Mainnet PulseChain addresses (as provided)
        address _vpls      = 0x79BB3A0Ee435f957ce4f54eE8c3CFADc7278da0C;
        address _wpls      = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
        address _pew       = 0x9deeaF046e144Fb6304A5ACD2aF142bBfE958030;
        address _router    = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
        address _burnVault = 0x4837457748994e8da5ad3162BA97350e9b1e6fe4;

        if (_vpls == address(0) || _pew == address(0) || _wpls == address(0)) revert ZeroAddress();
        if (_router == address(0) || _burnVault == address(0)) revert ZeroAddress();

        VPLS = IERC20(_vpls);
        WPLS = IERC20(_wpls);
        PEWPEW = IERC20(_pew);

        router = IPulseXV2Router02(_router);
        burnVault = ISimpleBurnVault(_burnVault);

        callerRewardBps = 5000; // 50%
        burnBps = 5000;         // 50%
        slippageBps = 200;      // 2% DEFAULT
        vplsSwapPercentBps = 1; // 0.01% of vault vPLS balance

        swapTimeout = 180;
        harvestCooldown = 12 hours;

        address[] memory path = new address[](3);
        path[0] = _vpls;
        path[1] = _wpls;
        path[2] = _pew;
        vplsToPewPath = path;

        _setCachedReversePath(path);

        // Approve router for vPLS once (max)
        _approveMax(VPLS, _router);

        // Require 100,000 PEWPEW (18 decimals assumed) to call harvest
        harvestPewRequirement = 100_000 * 1e18;

        _enforceSplit();
    }

    /* ========== DEPOSIT (pull-in any ERC20, including VPLS) ========== */
    function depositToken(address token, uint256 amount)
        external
        nonReentrant
        whenNotPaused
    {
        IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
        emit Deposited(token, msg.sender, amount);
    }

    /* ========== INTERNAL HELPERS ========== */

    function _approveMax(IERC20 token, address spender) internal {
        token.safeApprove(spender, 0);
        token.safeApprove(spender, type(uint256).max);
    }

    function _setCachedReversePath(address[] memory forwardPath) internal {
        uint256 len = forwardPath.length;
        address[] memory rev = new address[](len);
        for (uint256 i = 0; i < len; ) {
            rev[i] = forwardPath[len - 1 - i];
            unchecked { ++i; }
        }
        _pewToVplsPath = rev;
    }

    function _swapVplsToPew(uint256 vplsToSwap, uint256 minOut)
        internal
        returns (uint256 received)
    {
        IPulseXV2Router02 _router = router; // cache SLOAD
        address[] memory _path = vplsToPewPath; // dynamic array copy to memory

        uint256 beforeBal = PEWPEW.balanceOf(address(this));

        _router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            vplsToSwap,
            minOut,
            _path,
            address(this),
            block.timestamp + swapTimeout
        );

        received = PEWPEW.balanceOf(address(this)) - beforeBal;
        if (received < minOut) revert Slippage();
    }

    function _distribute(uint256 amount) internal returns (uint256 callerAmt, uint256 burnTotal) {
        uint256 _callerBps = callerRewardBps;
        uint256 _burnBps = burnBps;

        callerAmt = (amount * _callerBps) / BPS_DENOM;
        uint256 burnAmt = (amount * _burnBps) / BPS_DENOM;
        uint256 remainder = amount - callerAmt - burnAmt;

        if (callerAmt > 0) {
            PEWPEW.safeTransfer(msg.sender, callerAmt);
            totalCallerPaid += callerAmt;
        }

        burnTotal = burnAmt + remainder;
        if (burnTotal > 0) {
            totalBurned += burnTotal;

            PEWPEW.safeTransfer(address(burnVault), burnTotal);
            (bool ok, ) = address(burnVault).call(
                abi.encodeWithSelector(ISimpleBurnVault.burn.selector, address(PEWPEW))
            );
            if (!ok) emit BurnCallFailed(address(burnVault), address(PEWPEW), burnTotal);
        }
    }

    function _quoteMinOut(uint256 amountIn) internal view returns (uint256 minOut, uint256 expectedOut) {
        uint256[] memory expected = router.getAmountsOut(amountIn, vplsToPewPath);
        expectedOut = expected[expected.length - 1];

        uint256 _slip = slippageBps;
        minOut = (expectedOut * (BPS_DENOM - _slip)) / BPS_DENOM;
    }

    function _harvestCore(bool enforceCooldown, bool enforcePewRequirement)
        internal
        returns (uint256 vplsToSwap, uint256 pewReceived, uint256 callerPaid, uint256 burnPaid)
    {
        if (enforceCooldown) {
            uint256 _last = lastHarvest;
            uint256 _cooldown = harvestCooldown;
            if (_last != 0 && block.timestamp < _last + _cooldown) revert Cooldown();
        }
        if (enforcePewRequirement) {
            if (PEWPEW.balanceOf(msg.sender) < harvestPewRequirement) revert NotEnoughPewpew();
        }

        uint256 totalVpls = VPLS.balanceOf(address(this));
        uint256 vplsToSwapLocal = (totalVpls * vplsSwapPercentBps) / BPS_DENOM;
        if (vplsToSwapLocal == 0) revert NoRewards();

        (uint256 minOut, ) = _quoteMinOut(vplsToSwapLocal);
        uint256 pewReceivedLocal = _swapVplsToPew(vplsToSwapLocal, minOut);

        (uint256 callerPaidLocal, uint256 burnPaidLocal) = _distribute(pewReceivedLocal);

        if (enforceCooldown) lastHarvest = block.timestamp;

        return (vplsToSwapLocal, pewReceivedLocal, callerPaidLocal, burnPaidLocal);
    }

    /* ========== HARVEST ========== */

    function harvest()
        external
        nonReentrant
        whenNotPaused
    {
        (uint256 vplsToSwap, uint256 pewReceived, uint256 callerPaid, uint256 burnPaid) =
            _harvestCore(true, true);

        emit Harvested(
            msg.sender,
            vplsToSwap,
            pewReceived,
            callerPaid,
            burnPaid,
            block.timestamp + harvestCooldown
        );
    }

    /* ========== EMERGENCY HARVEST ========== */

    function emergencyHarvest()
        external
        nonReentrant
        onlyOwner
        whenNotPaused
    {
        (uint256 vplsToSwap, uint256 pewReceived, , uint256 burnPaid) =
            _harvestCore(false, false);

        emit EmergencyHarvest(msg.sender, vplsToSwap, pewReceived, burnPaid);
    }

    /* ========== PREVIEW FUNCTIONS ========== */

    function previewHarvest()
        external
        view
        returns (
            uint256 totalVpls,
            uint256 vplsToSwap,
            uint256 expectedPew,
            uint256 callerReward,
            uint256 burnAmount
        )
    {
        totalVpls = VPLS.balanceOf(address(this));
        vplsToSwap = (totalVpls * vplsSwapPercentBps) / BPS_DENOM;

        if (vplsToSwap == 0) return (totalVpls, 0, 0, 0, 0);

        uint256[] memory amounts = router.getAmountsOut(vplsToSwap, vplsToPewPath);
        expectedPew = amounts[amounts.length - 1];

        callerReward = (expectedPew * callerRewardBps) / BPS_DENOM;
        burnAmount = expectedPew - callerReward;
    }

    /// @notice Returns the cached reverse path used for value previews (PEWPEW -> ... -> VPLS).
    function previewReversePath() external view returns (address[] memory) {
        return _pewToVplsPath;
    }

    /// @notice Harvest Extraction Percent (caller-only), expressed as vPLS value per year (1e18 = 100%).
    /// @dev Uses router quotes and can be manipulated within a block; informational only.
    function previewHarvestExtractionPercent()
        external
        view
        returns (
            uint256 extractionPercent,
            uint256 callerPewPerYear,
            uint256 callerVplsValueYear
        )
    {
        uint256 vaultVpls = VPLS.balanceOf(address(this));
        uint256 _cooldown = harvestCooldown;
        if (vaultVpls == 0 || _cooldown == 0) return (0, 0, 0);

        uint256 harvestsPerYear = (365 days) / _cooldown;

        uint256 vplsToSwap = (vaultVpls * vplsSwapPercentBps) / BPS_DENOM;
        if (vplsToSwap == 0) return (0, 0, 0);

        uint256[] memory pewOut = router.getAmountsOut(vplsToSwap, vplsToPewPath);
        uint256 pewPerHarvest = pewOut[pewOut.length - 1];

        uint256 callerPewPerHarvest = (pewPerHarvest * callerRewardBps) / BPS_DENOM;
        callerPewPerYear = callerPewPerHarvest * harvestsPerYear;

        uint256[] memory vplsOut = router.getAmountsOut(callerPewPerYear, _pewToVplsPath);
        callerVplsValueYear = vplsOut[vplsOut.length - 1];

        extractionPercent = (callerVplsValueYear * 1e18) / vaultVpls;
    }

    function previewCallerReward(address caller)
        external
        view
        returns (
            bool meetsRequirement,
            uint256 callerPewReward,
            uint256 burnAmount,
            uint256 vplsToSwap,
            uint256 expectedPew
        )
    {
        meetsRequirement = PEWPEW.balanceOf(caller) >= harvestPewRequirement;

        uint256 totalVpls = VPLS.balanceOf(address(this));
        vplsToSwap = (totalVpls * vplsSwapPercentBps) / BPS_DENOM;

        if (vplsToSwap == 0) return (meetsRequirement, 0, 0, 0, 0);

        uint256[] memory amounts = router.getAmountsOut(vplsToSwap, vplsToPewPath);
        expectedPew = amounts[amounts.length - 1];

        callerPewReward = (expectedPew * callerRewardBps) / BPS_DENOM;
        burnAmount = expectedPew - callerPewReward;
    }

    function getTotals()
        external
        view
        returns (uint256 callerPaid, uint256 burned)
    {
        return (totalCallerPaid, totalBurned);
    }

    /* ========== ANTI-LP IDENTITY HELPERS ========== */

    function isLP() external pure returns (bool) {
        return false;
    }

    function isLiquidityPool() external pure returns (bool) {
        return false;
    }

    /* ========== OWNER CONTROLS ========== */

    function setCallerRewardBps(uint256 _bps) external onlyOwner {
        if (_bps > BPS_DENOM) revert BpsTooHigh();
        uint256 old = callerRewardBps;
        callerRewardBps = _bps;
        _enforceSplit();
        emit CallerRewardUpdated(old, _bps);
    }

    function setBurnBps(uint256 _bps) external onlyOwner {
        if (_bps > BPS_DENOM) revert BpsTooHigh();
        uint256 old = burnBps;
        burnBps = _bps;
        _enforceSplit();
        emit BurnBpsUpdated(old, _bps);
    }

    function _enforceSplit() internal view {
        require(callerRewardBps + burnBps <= BPS_DENOM, "Split exceeds 100%");
    }

    function setVplsSwapPercentBps(uint256 _bps) external onlyOwner {
        if (_bps > BPS_DENOM) revert BpsTooHigh();
        uint256 old = vplsSwapPercentBps;
        vplsSwapPercentBps = _bps;
        emit SwapPercentUpdated(old, _bps);
    }

    function setSlippageBps(uint256 _bps) external onlyOwner {
        if (_bps > 8000) revert BpsTooHigh();
        uint256 old = slippageBps;
        slippageBps = _bps;
        emit SlippageUpdated(old, _bps);
    }

    function setHarvestCooldown(uint256 _cooldown) external onlyOwner {
        uint256 old = harvestCooldown;
        harvestCooldown = _cooldown;
        emit HarvestCooldownUpdated(old, _cooldown);
    }

    function setSwapTimeout(uint256 _timeout) external onlyOwner {
        uint256 old = swapTimeout;
        swapTimeout = _timeout;
        emit SwapTimeoutUpdated(old, _timeout);
    }

    function setRouter(address _router) external onlyOwner {
        if (_router == address(0)) revert ZeroAddress();
        address old = address(router);

        router = IPulseXV2Router02(_router);
        emit RouterUpdated(old, _router);

        _approveMax(VPLS, _router);
    }

    /// @dev Allowed paths:
    /// - [VPLS, PEWPEW]
    /// - [VPLS, WPLS, PEWPEW]
    function setPaths(address[] calldata newPath) external onlyOwner {
        uint256 len = newPath.length;
        if (len < 2) revert InvalidPath();
        if (newPath[0] != address(VPLS)) revert InvalidPath();
        if (newPath[len - 1] != address(PEWPEW)) revert InvalidPath();

        for (uint256 i = 0; i < len; ) {
            if (newPath[i] == address(0)) revert InvalidPath();
            unchecked { ++i; }
        }

        address[] memory old = vplsToPewPath;
        vplsToPewPath = newPath;
        _setCachedReversePath(newPath);

        emit PathsUpdated(old, newPath);
    }

    function setBurnVault(address _vault) external onlyOwner {
        if (_vault == address(0)) revert ZeroAddress();
        address old = address(burnVault);
        burnVault = ISimpleBurnVault(_vault);
        emit BurnVaultUpdated(old, _vault);
    }

    function setHarvestPewRequirement(uint256 amount) external onlyOwner {
        uint256 old = harvestPewRequirement;
        harvestPewRequirement = amount;
        emit HarvestRequirementUpdated(old, amount);
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    /* ========== EMERGENCY RESCUE (OWNER‑ONLY) ========== */

    /// @notice Emergency Rescue (Owner‑only)
    /// @dev Allows the owner to recover any ERC‑20 token accidentally sent to this contract.
    function rescueToken(address token, uint256 amount)
        external
        onlyOwner
        nonReentrant
    {
        IERC20(token).safeTransfer(owner(), amount);
    }

    /// @notice Emergency Rescue (Owner‑only)
    /// @dev Allows the owner to recover native PLS accidentally sent to this contract.
    function rescueNative()
        external
        onlyOwner
        nonReentrant
    {
        uint256 bal = address(this).balance;
        (bool ok, ) = owner().call{value: bal}("");
        if (!ok) revert NativeTransferFailed();
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"london","compilationTarget":{"PewVVault.sol":"PewVPLSVault"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"BpsTooHigh","inputs":[]},{"type":"error","name":"ContractPaused","inputs":[]},{"type":"error","name":"Cooldown","inputs":[]},{"type":"error","name":"InvalidPath","inputs":[]},{"type":"error","name":"NativeTransferFailed","inputs":[]},{"type":"error","name":"NoRewards","inputs":[]},{"type":"error","name":"NotEnoughPewpew","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"error","name":"Reentrancy","inputs":[]},{"type":"error","name":"Slippage","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"event","name":"BurnBpsUpdated","inputs":[{"type":"uint256","name":"oldBps","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBps","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BurnCallFailed","inputs":[{"type":"address","name":"burnVault","internalType":"address","indexed":true},{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BurnVaultUpdated","inputs":[{"type":"address","name":"oldVault","internalType":"address","indexed":true},{"type":"address","name":"newVault","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"CallerRewardUpdated","inputs":[{"type":"uint256","name":"oldBps","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBps","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposited","inputs":[{"type":"address","name":"token","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"EmergencyHarvest","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"uint256","name":"vplsSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"pewReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"burnPaid","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"HarvestCooldownUpdated","inputs":[{"type":"uint256","name":"oldCooldown","internalType":"uint256","indexed":false},{"type":"uint256","name":"newCooldown","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"HarvestRequirementUpdated","inputs":[{"type":"uint256","name":"oldRequirement","internalType":"uint256","indexed":false},{"type":"uint256","name":"newRequirement","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Harvested","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"uint256","name":"vplsSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"pewReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"callerPaid","internalType":"uint256","indexed":false},{"type":"uint256","name":"burnPaid","internalType":"uint256","indexed":false},{"type":"uint256","name":"nextAvailableHarvest","internalType":"uint256","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":"PathsUpdated","inputs":[{"type":"address[]","name":"oldPath","internalType":"address[]","indexed":false},{"type":"address[]","name":"newPath","internalType":"address[]","indexed":false}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RouterUpdated","inputs":[{"type":"address","name":"oldRouter","internalType":"address","indexed":true},{"type":"address","name":"newRouter","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SlippageUpdated","inputs":[{"type":"uint256","name":"oldBps","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBps","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapPercentUpdated","inputs":[{"type":"uint256","name":"oldBps","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBps","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTimeoutUpdated","inputs":[{"type":"uint256","name":"oldTimeout","internalType":"uint256","indexed":false},{"type":"uint256","name":"newTimeout","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"PEWPEW","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"VPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnBps","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ISimpleBurnVault"}],"name":"burnVault","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"callerRewardBps","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositToken","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyHarvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"callerPaid","internalType":"uint256"},{"type":"uint256","name":"burned","internalType":"uint256"}],"name":"getTotals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"harvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"harvestCooldown","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"harvestPewRequirement","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLP","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLiquidityPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastHarvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"meetsRequirement","internalType":"bool"},{"type":"uint256","name":"callerPewReward","internalType":"uint256"},{"type":"uint256","name":"burnAmount","internalType":"uint256"},{"type":"uint256","name":"vplsToSwap","internalType":"uint256"},{"type":"uint256","name":"expectedPew","internalType":"uint256"}],"name":"previewCallerReward","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalVpls","internalType":"uint256"},{"type":"uint256","name":"vplsToSwap","internalType":"uint256"},{"type":"uint256","name":"expectedPew","internalType":"uint256"},{"type":"uint256","name":"callerReward","internalType":"uint256"},{"type":"uint256","name":"burnAmount","internalType":"uint256"}],"name":"previewHarvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"extractionPercent","internalType":"uint256"},{"type":"uint256","name":"callerPewPerYear","internalType":"uint256"},{"type":"uint256","name":"callerVplsValueYear","internalType":"uint256"}],"name":"previewHarvestExtractionPercent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"previewReversePath","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueNative","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueToken","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXV2Router02"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBurnBps","inputs":[{"type":"uint256","name":"_bps","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBurnVault","inputs":[{"type":"address","name":"_vault","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCallerRewardBps","inputs":[{"type":"uint256","name":"_bps","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHarvestCooldown","inputs":[{"type":"uint256","name":"_cooldown","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHarvestPewRequirement","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPaths","inputs":[{"type":"address[]","name":"newPath","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRouter","inputs":[{"type":"address","name":"_router","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSlippageBps","inputs":[{"type":"uint256","name":"_bps","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapTimeout","inputs":[{"type":"uint256","name":"_timeout","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setVplsSwapPercentBps","inputs":[{"type":"uint256","name":"_bps","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"slippageBps","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTimeout","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBurned","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalCallerPaid","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vplsSwapPercentBps","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"vplsToPewPath","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x60e06040523480156200001157600080fd5b506200001d33620001fb565b600180557379bb3a0ee435f957ce4f54ee8c3cfadc7278da0c73a1077a294dde1b09bb078844df40758a5d0f9a27739deeaf046e144fb6304a5acd2af142bbfe95803073165c3410fc91ef562c50559f7d2289febed552d9734837457748994e8da5ad3162ba97350e9b1e6fe46001600160a01b03858116608090815285821660a05284821660c052600280546001600160a01b03199081168685161790915560038054909116928416929092178255611388600481905560055560c8600655600160075560b460085561a8c0600955604080518381529182019052600091602082016060803683370190505090508581600081518110620001235762000123620005b9565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001815181106200015a576200015a620005b9565b60200260200101906001600160a01b031690816001600160a01b0316815250508381600281518110620001915762000191620005b9565b6001600160a01b039092166020928302919091018201528151620001bc91600b919084019062000522565b50620001c8816200024b565b608051620001d790846200032b565b69152d02c7e14af6800000600d55620001ef6200035e565b50505050505062000673565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516000816001600160401b038111156200026a576200026a620005a3565b60405190808252806020026020018201604052801562000294578160200160208202803683370190505b50905060005b828110156200030f578381620002b2600186620005e5565b620002be9190620005e5565b81518110620002d157620002d1620005b9565b6020026020010151828281518110620002ee57620002ee620005b9565b6001600160a01b03909216602092830291909101909101526001016200029a565b5080516200032590600c90602084019062000522565b50505050565b620003426001600160a01b038316826000620003be565b6200035a6001600160a01b03831682600019620003be565b5050565b61271060055460045462000373919062000601565b1115620003bc5760405162461bcd60e51b815260206004820152601260248201527153706c69742065786365656473203130302560701b60448201526064015b60405180910390fd5b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620004169185916200041b16565b505050565b600080836001600160a01b03168360405162000438919062000617565b6000604051808303816000865af19150503d806000811462000477576040519150601f19603f3d011682016040523d82523d6000602084013e6200047c565b606091505b509150915081620004c45760405162461bcd60e51b8152602060048201526011602482015270115490cc8c0818d85b1b0819985a5b1959607a1b6044820152606401620003b3565b805115620003255780806020019051810190620004e2919062000648565b620003255760405162461bcd60e51b815260206004820152600f60248201526e115490cc8c081bdc0819985a5b1959608a1b6044820152606401620003b3565b8280548282559060005260206000209081019282156200057a579160200282015b828111156200057a57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000543565b50620005889291506200058c565b5090565b5b808211156200058857600081556001016200058d565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115620005fb57620005fb620005cf565b92915050565b80820180821115620005fb57620005fb620005cf565b6000825160005b818110156200063a57602081860181015185830152016200061e565b506000920191825250919050565b6000602082840312156200065b57600080fd5b815180151581146200066c57600080fd5b9392505050565b60805160a05160c051612bc56200070c60003960008181610289015281816111050152818161185c01528181611ca20152818161228c015281816123860152818161249b015281816125140152818161254d01526126200152600061074b01526000818161062e0152818161091b01528181611195015281816114db015281816116f9015281816117db0152611d4c0152612bc56000f3fe60806040526004361061026b5760003560e01c8063715018a611610144578063c0d78655116100b6578063ef8ef56f1161007a578063ef8ef56f14610739578063efb036a31461076d578063f1a392da1461078d578063f2fde38b146107a3578063f887ea40146107c3578063fc82f084146107e357600080fd5b8063c0d78655146106ad578063c6807111146106cd578063d643ad32146106ed578063d89135cd1461070d578063e3d604c01461072357600080fd5b806394caf06b1161010857806394caf06b146105d057806394de34f1146105f05780639966536f14610606578063a89cb1e51461061c578063addc831e14610650578063b454c0c71461067057600080fd5b8063715018a61461054a5780637f5941ad1461055f5780638456cb591461057557806384e10a901461058a5780638da5cb5b146105b257600080fd5b8063430d8536116101dd57806350f42f2f116101a157806350f42f2f1461049357806353c459c4146104b557806353deb3d6146104ff578063578c71d9146105155780635c975abb1461052b57806360755d431461030e57600080fd5b8063430d85361461040957806344d4e228146104295780634641257d146104495780634b21e5c81461045e5780634c472f061461047357600080fd5b8063230cc5981161022f578063230cc5981461034e578063234d200f1461037e578063338b5dea1461039457806333f3d628146103b4578063368e1989146103d45780633f4ba83a146103f457600080fd5b80630c95dc171461027757806316696033146102c85780631a3ce4e6146102ec5780631a88447b1461030e5780631e304fcd1461032e57600080fd5b3661027257005b600080fd5b34801561028357600080fd5b506102ab7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d457600080fd5b506102de600d5481565b6040519081526020016102bf565b3480156102f857600080fd5b5061030c61030736600461277a565b6107f8565b005b34801561031a57600080fd5b5060005b60405190151581526020016102bf565b34801561033a57600080fd5b5061030c61034936600461277a565b61088c565b34801561035a57600080fd5b506103636108f5565b604080519384526020840192909252908201526060016102bf565b34801561038a57600080fd5b506102de60095481565b3480156103a057600080fd5b5061030c6103af3660046127af565b610b9b565b3480156103c057600080fd5b5061030c6103cf3660046127af565b610c4b565b3480156103e057600080fd5b506102ab6103ef36600461277a565b610ccc565b34801561040057600080fd5b5061030c610cf6565b34801561041557600080fd5b5061030c61042436600461277a565b610d2b565b34801561043557600080fd5b5061030c61044436600461277a565b610d94565b34801561045557600080fd5b5061030c610e20565b34801561046a57600080fd5b5061030c610efe565b34801561047f57600080fd5b5061030c61048e36600461277a565b610fe0565b34801561049f57600080fd5b506104a8611074565b6040516102bf919061281d565b3480156104c157600080fd5b506104d56104d0366004612837565b6110d6565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102bf565b34801561050b57600080fd5b506102de60055481565b34801561052157600080fd5b506102de60065481565b34801561053757600080fd5b50600054600160a01b900460ff1661031e565b34801561055657600080fd5b5061030c611313565b34801561056b57600080fd5b506102de600e5481565b34801561058157600080fd5b5061030c611348565b34801561059657600080fd5b50600e54600f54604080519283526020830191909152016102bf565b3480156105be57600080fd5b506000546001600160a01b03166102ab565b3480156105dc57600080fd5b5061030c6105eb366004612837565b61137b565b3480156105fc57600080fd5b506102de60085481565b34801561061257600080fd5b506102de60075481565b34801561062857600080fd5b506102ab7f000000000000000000000000000000000000000000000000000000000000000081565b34801561065c57600080fd5b5061030c61066b36600461277a565b61141f565b34801561067c57600080fd5b506106856114b3565b604080519586526020860194909452928401919091526060830152608082015260a0016102bf565b3480156106b957600080fd5b5061030c6106c8366004612837565b611654565b3480156106d957600080fd5b506003546102ab906001600160a01b031681565b3480156106f957600080fd5b5061030c61070836600461277a565b611722565b34801561071957600080fd5b506102de600f5481565b34801561072f57600080fd5b506102de60045481565b34801561074557600080fd5b506102ab7f000000000000000000000000000000000000000000000000000000000000000081565b34801561077957600080fd5b5061030c610788366004612852565b61178b565b34801561079957600080fd5b506102de600a5481565b3480156107af57600080fd5b5061030c6107be366004612837565b611a26565b3480156107cf57600080fd5b506002546102ab906001600160a01b031681565b3480156107ef57600080fd5b5061030c611a84565b6000546001600160a01b03163314610823576040516330cd747160e01b815260040160405180910390fd5b611f408111156108465760405163bbf4268d60e01b815260040160405180910390fd5b600680549082905560408051828152602081018490527f07af09e2b23ebab5dd29fa2271d6ca4795031f308caf26ca605f4a719ffeed6191015b60405180910390a15050565b6000546001600160a01b031633146108b7576040516330cd747160e01b815260040160405180910390fd5b600d80549082905560408051828152602081018490527f814a03795b0034fd29b876d88e84028f2b8f0fb280ad580a5eb2ed8604ff78579101610880565b6040516370a0823160e01b81523060048201526000908190819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098691906128c7565b600954909150811580610997575080155b156109ab5750600094859450849350915050565b60006109bb826301e133806128f6565b90506000612710600754856109d09190612918565b6109da91906128f6565b9050806000036109f557506000968796508695509350505050565b60025460405163d06ca61f60e01b81526000916001600160a01b03169063d06ca61f90610a29908590600b90600401612935565b600060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a6e91908101906129a7565b905060008160018351610a819190612a65565b81518110610a9157610a91612a78565b60200260200101519050600061271060045483610aae9190612918565b610ab891906128f6565b9050610ac48582612918565b60025460405163d06ca61f60e01b8152919a506000916001600160a01b039091169063d06ca61f90610afd908d90600c90600401612935565b600060405180830381865afa158015610b1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b4291908101906129a7565b90508060018251610b539190612a65565b81518110610b6357610b63612a78565b602002602001015198508789670de0b6b3a7640000610b829190612918565b610b8c91906128f6565b9a505050505050505050909192565b600260015403610bbe5760405163558a1e0360e11b815260040160405180910390fd5b6002600155600054600160a01b900460ff1615610bee5760405163ab35696f60e01b815260040160405180910390fd5b610c036001600160a01b038316333084611b5d565b60405181815233906001600160a01b038416907f8752a472e571a816aea92eec8dae9baf628e840f4929fbcc2d155e6233ff68a79060200160405180910390a3505060018055565b6000546001600160a01b03163314610c76576040516330cd747160e01b815260040160405180910390fd5b600260015403610c995760405163558a1e0360e11b815260040160405180910390fd5b6002600155610cc4610cb36000546001600160a01b031690565b6001600160a01b0384169083611bce565b505060018055565b600b8181548110610cdc57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610d21576040516330cd747160e01b815260040160405180910390fd5b610d29611c03565b565b6000546001600160a01b03163314610d56576040516330cd747160e01b815260040160405180910390fd5b600880549082905560408051828152602081018490527fb1526092a93c65fcdc17421d27e2e30fcb5aa9b40085e50be17a4b76c3c51c519101610880565b6000546001600160a01b03163314610dbf576040516330cd747160e01b815260040160405180910390fd5b612710811115610de25760405163bbf4268d60e01b815260040160405180910390fd5b600780549082905560408051828152602081018490527f73d25e907c42475438d54845cc12bb5f905b65e5ee3f9ff77c5538d727c20eae9101610880565b600260015403610e435760405163558a1e0360e11b815260040160405180910390fd5b6002600155600054600160a01b900460ff1615610e735760405163ab35696f60e01b815260040160405180910390fd5b600080600080610e84600180611c3a565b9350935093509350336001600160a01b03167f2a86a2dac4c093ea22ea0b6ce2656ba747d1c7c6a105875b1859e73b1dfae4f28585858560095442610ec99190612a8e565b604080519586526020860194909452928401919091526060830152608082015260a00160405180910390a25050600180555050565b600260015403610f215760405163558a1e0360e11b815260040160405180910390fd5b60026001556000546001600160a01b03163314610f51576040516330cd747160e01b815260040160405180910390fd5b600054600160a01b900460ff1615610f7c5760405163ab35696f60e01b815260040160405180910390fd5b6000806000610f8c600080611c3a565b60408051858152602081018590528082018390529051949750929550935033927f215413cf8e7874649b7c0e1223f31958053e2537885c6321cfa7b533fbe33aff928190036060019150a250506001805550565b6000546001600160a01b0316331461100b576040516330cd747160e01b815260040160405180910390fd5b61271081111561102e5760405163bbf4268d60e01b815260040160405180910390fd5b600480549082905561103e611e4b565b60408051828152602081018490527f9b7c115fe6f7f2eebe822f6904be104bd740a447f8821ce8a4a335d98d7d27d79101610880565b6060600c8054806020026020016040519081016040528092919081815260200182805480156110cc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110ae575b5050505050905090565b600d546040516370a0823160e01b81526001600160a01b038381166004830152600092839283928392839290917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561114c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117091906128c7565b6040516370a0823160e01b815230600482015291111595506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156111dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120091906128c7565b9050612710600754826112139190612918565b61121d91906128f6565b92508260000361123a57506000935083925082915081905061130a565b60025460405163d06ca61f60e01b81526000916001600160a01b03169063d06ca61f9061126e908790600b90600401612935565b600060405180830381865afa15801561128b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112b391908101906129a7565b905080600182516112c49190612a65565b815181106112d4576112d4612a78565b60200260200101519250612710600454846112ef9190612918565b6112f991906128f6565b95506113058684612a65565b945050505b91939590929450565b6000546001600160a01b0316331461133e576040516330cd747160e01b815260040160405180910390fd5b610d296000611ea6565b6000546001600160a01b03163314611373576040516330cd747160e01b815260040160405180910390fd5b610d29611ef6565b6000546001600160a01b031633146113a6576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166113cd5760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ff26ba2f28117abfe606670ce2ad6e62ad96ccd37b6d1406afad3b431c7ae1b5f90600090a35050565b6000546001600160a01b0316331461144a576040516330cd747160e01b815260040160405180910390fd5b61271081111561146d5760405163bbf4268d60e01b815260040160405180910390fd5b600580549082905561147d611e4b565b60408051828152602081018490527f5fd4dd55bd00e4ef8693a73e37974145a97ddf1063426ef2b6d5afcc2d4a94979101610880565b6040516370a0823160e01b815230600482015260009081908190819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611522573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154691906128c7565b9450612710600754866115599190612918565b61156391906128f6565b93508360000361157e5750600092508291508190508061164d565b60025460405163d06ca61f60e01b81526000916001600160a01b03169063d06ca61f906115b2908890600b90600401612935565b600060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115f791908101906129a7565b905080600182516116089190612a65565b8151811061161857611618612a78565b60200260200101519350612710600454856116339190612918565b61163d91906128f6565b92506116498385612a65565b9150505b9091929394565b6000546001600160a01b0316331461167f576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166116a65760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168490600090a361171e7f000000000000000000000000000000000000000000000000000000000000000083611f33565b5050565b6000546001600160a01b0316331461174d576040516330cd747160e01b815260040160405180910390fd5b600980549082905560408051828152602081018490527f4bd0a5299f10ae536da0b7edbbeb4522c96adfaeb7cf675a7396bdbeef8c077a9101610880565b6000546001600160a01b031633146117b6576040516330cd747160e01b815260040160405180910390fd5b8060028110156117d9576040516320db826760e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168383600081811061181657611816612a78565b905060200201602081019061182b9190612837565b6001600160a01b031614611852576040516320db826760e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168383611889600185612a65565b81811061189857611898612a78565b90506020020160208101906118ad9190612837565b6001600160a01b0316146118d4576040516320db826760e01b815260040160405180910390fd5b60005b818110156119375760008484838181106118f3576118f3612a78565b90506020020160208101906119089190612837565b6001600160a01b03160361192f576040516320db826760e01b815260040160405180910390fd5b6001016118d7565b506000600b80548060200260200160405190810160405280929190818152602001828054801561199057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611972575b505050505090508383600b91906119a89291906126ad565b506119e5848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611f5e92505050565b7f29dd278f044e2c983a4567d336db5954946ae111f22ba8a6ddb9b2cdacee1fa6818585604051611a1893929190612aa1565b60405180910390a150505050565b6000546001600160a01b03163314611a51576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b038116611a785760405163d92e233d60e01b815260040160405180910390fd5b611a8181611ea6565b50565b6000546001600160a01b03163314611aaf576040516330cd747160e01b815260040160405180910390fd5b600260015403611ad25760405163558a1e0360e11b815260040160405180910390fd5b6002600155476000611aec6000546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b36576040519150601f19603f3d011682016040523d82523d6000602084013e611b3b565b606091505b5050905080610cc457604051633d2cec6f60e21b815260040160405180910390fd5b6040516001600160a01b0380851660248301528316604482015260648101829052611bc89085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612027565b50505050565b6040516001600160a01b038316602482015260448101829052611bfe90849063a9059cbb60e01b90606401611b91565b505050565b6000805460ff60a01b1916815560405133917f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91a2565b6000806000808515611c8457600a546009548115801590611c635750611c608183612a8e565b42105b15611c815760405163b0782df760e01b815260040160405180910390fd5b50505b8415611d3457600d546040516370a0823160e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1591906128c7565b1015611d3457604051635674b7e960e11b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611d9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbf91906128c7565b9050600061271060075483611dd49190612918565b611dde91906128f6565b905080600003611e0157604051630fec21fd60e21b815260040160405180910390fd5b6000611e0c82612123565b5090506000611e1b8383612200565b9050600080611e2983612430565b915091508b15611e385742600a555b939b919a50985091965090945050505050565b612710600554600454611e5e9190612a8e565b1115610d295760405162461bcd60e51b815260206004820152601260248201527153706c69742065786365656473203130302560701b60448201526064015b60405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000805460ff60a01b1916600160a01b17815560405133917f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891a2565b611f486001600160a01b03831682600061267d565b61171e6001600160a01b0383168260001961267d565b805160008167ffffffffffffffff811115611f7b57611f7b612991565b604051908082528060200260200182016040528015611fa4578160200160208202803683370190505b50905060005b82811015612013578381611fbf600186612a65565b611fc99190612a65565b81518110611fd957611fd9612a78565b6020026020010151828281518110611ff357611ff3612a78565b6001600160a01b0390921660209283029190910190910152600101611faa565b508051611bc890600c906020840190612710565b600080836001600160a01b0316836040516120429190612b02565b6000604051808303816000865af19150503d806000811461207f576040519150601f19603f3d011682016040523d82523d6000602084013e612084565b606091505b5091509150816120ca5760405162461bcd60e51b8152602060048201526011602482015270115490cc8c0818d85b1b0819985a5b1959607a1b6044820152606401611e9d565b805115611bc857808060200190518101906120e59190612b31565b611bc85760405162461bcd60e51b815260206004820152600f60248201526e115490cc8c081bdc0819985a5b1959608a1b6044820152606401611e9d565b60025460405163d06ca61f60e01b8152600091829182916001600160a01b03169063d06ca61f9061215b908790600b90600401612935565b600060405180830381865afa158015612178573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121a091908101906129a7565b905080600182516121b19190612a65565b815181106121c1576121c1612a78565b6020026020010151915060006006549050612710816127106121e39190612a65565b6121ed9085612918565b6121f791906128f6565b93505050915091565b600254600b8054604080516020808402820181019092528281526000946001600160a01b0316938593919290919083018282801561226757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612249575b50506040516370a0823160e01b81523060048201529394506000936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693506370a0823192506024019050602060405180830381865afa1580156122d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fb91906128c7565b9050826001600160a01b0316635c11d795878785306008544261231e9190612a8e565b6040518663ffffffff1660e01b815260040161233e959493929190612b53565b600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa1580156123d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fa91906128c7565b6124049190612a65565b935084841015612427576040516307dd37f760e41b815260040160405180910390fd5b50505092915050565b60045460055460009182916127106124488387612918565b61245291906128f6565b935060006127106124638388612918565b61246d91906128f6565b905060008161247c8789612a65565b6124869190612a65565b905085156124da576124c26001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163388611bce565b85600e60008282546124d49190612a8e565b90915550505b6124e48183612a8e565b945084156126745784600f60008282546124fe9190612a8e565b909155505060035461253d906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911687611bce565b6003546040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152600092169063226bf2d160e21b9060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516125c29190612b02565b6000604051808303816000865af19150503d80600081146125ff576040519150601f19603f3d011682016040523d82523d6000602084013e612604565b606091505b5050905080612672576003546040518781526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169216907f5e5bdd416984c648505f4e35fe3d6fad12be0b82af85b178796220c6a12e33d19060200160405180910390a35b505b50505050915091565b6040516001600160a01b038316602482015260448101829052611bfe90849063095ea7b360e01b90606401611b91565b828054828255906000526020600020908101928215612700579160200282015b828111156127005781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906126cd565b5061270c929150612765565b5090565b828054828255906000526020600020908101928215612700579160200282015b8281111561270057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612730565b5b8082111561270c5760008155600101612766565b60006020828403121561278c57600080fd5b5035919050565b80356001600160a01b03811681146127aa57600080fd5b919050565b600080604083850312156127c257600080fd5b6127cb83612793565b946020939093013593505050565b600081518084526020808501945080840160005b838110156128125781516001600160a01b0316875295820195908201906001016127ed565b509495945050505050565b60208152600061283060208301846127d9565b9392505050565b60006020828403121561284957600080fd5b61283082612793565b6000806020838503121561286557600080fd5b823567ffffffffffffffff8082111561287d57600080fd5b818501915085601f83011261289157600080fd5b8135818111156128a057600080fd5b8660208260051b85010111156128b557600080fd5b60209290920196919550909350505050565b6000602082840312156128d957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008261291357634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761292f5761292f6128e0565b92915050565b60006040820184835260206040818501528185548084526060860191508660005282600020935060005b818110156129845784546001600160a01b03168352600194850194928401920161295f565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156129ba57600080fd5b825167ffffffffffffffff808211156129d257600080fd5b818501915085601f8301126129e657600080fd5b8151818111156129f8576129f8612991565b8060051b604051601f19603f83011681018181108582111715612a1d57612a1d612991565b604052918252848201925083810185019188831115612a3b57600080fd5b938501935b82851015612a5957845184529385019392850192612a40565b98975050505050505050565b8181038181111561292f5761292f6128e0565b634e487b7160e01b600052603260045260246000fd5b8082018082111561292f5761292f6128e0565b604081526000612ab460408301866127d9565b8281036020848101919091528482528591810160005b86811015612af6576001600160a01b03612ae385612793565b1682529282019290820190600101612aca565b50979650505050505050565b6000825160005b81811015612b235760208186018101518583015201612b09565b506000920191825250919050565b600060208284031215612b4357600080fd5b8151801515811461283057600080fd5b85815284602082015260a060408201526000612b7260a08301866127d9565b6001600160a01b039490941660608301525060800152939250505056fea264697066735822122081e63fcfbbbba849bfb55b7021ce751be6469db863e435cb12e2f4f15ac37da564736f6c63430008140033

Deployed ByteCode

0x60806040526004361061026b5760003560e01c8063715018a611610144578063c0d78655116100b6578063ef8ef56f1161007a578063ef8ef56f14610739578063efb036a31461076d578063f1a392da1461078d578063f2fde38b146107a3578063f887ea40146107c3578063fc82f084146107e357600080fd5b8063c0d78655146106ad578063c6807111146106cd578063d643ad32146106ed578063d89135cd1461070d578063e3d604c01461072357600080fd5b806394caf06b1161010857806394caf06b146105d057806394de34f1146105f05780639966536f14610606578063a89cb1e51461061c578063addc831e14610650578063b454c0c71461067057600080fd5b8063715018a61461054a5780637f5941ad1461055f5780638456cb591461057557806384e10a901461058a5780638da5cb5b146105b257600080fd5b8063430d8536116101dd57806350f42f2f116101a157806350f42f2f1461049357806353c459c4146104b557806353deb3d6146104ff578063578c71d9146105155780635c975abb1461052b57806360755d431461030e57600080fd5b8063430d85361461040957806344d4e228146104295780634641257d146104495780634b21e5c81461045e5780634c472f061461047357600080fd5b8063230cc5981161022f578063230cc5981461034e578063234d200f1461037e578063338b5dea1461039457806333f3d628146103b4578063368e1989146103d45780633f4ba83a146103f457600080fd5b80630c95dc171461027757806316696033146102c85780631a3ce4e6146102ec5780631a88447b1461030e5780631e304fcd1461032e57600080fd5b3661027257005b600080fd5b34801561028357600080fd5b506102ab7f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe95803081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d457600080fd5b506102de600d5481565b6040519081526020016102bf565b3480156102f857600080fd5b5061030c61030736600461277a565b6107f8565b005b34801561031a57600080fd5b5060005b60405190151581526020016102bf565b34801561033a57600080fd5b5061030c61034936600461277a565b61088c565b34801561035a57600080fd5b506103636108f5565b604080519384526020840192909252908201526060016102bf565b34801561038a57600080fd5b506102de60095481565b3480156103a057600080fd5b5061030c6103af3660046127af565b610b9b565b3480156103c057600080fd5b5061030c6103cf3660046127af565b610c4b565b3480156103e057600080fd5b506102ab6103ef36600461277a565b610ccc565b34801561040057600080fd5b5061030c610cf6565b34801561041557600080fd5b5061030c61042436600461277a565b610d2b565b34801561043557600080fd5b5061030c61044436600461277a565b610d94565b34801561045557600080fd5b5061030c610e20565b34801561046a57600080fd5b5061030c610efe565b34801561047f57600080fd5b5061030c61048e36600461277a565b610fe0565b34801561049f57600080fd5b506104a8611074565b6040516102bf919061281d565b3480156104c157600080fd5b506104d56104d0366004612837565b6110d6565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102bf565b34801561050b57600080fd5b506102de60055481565b34801561052157600080fd5b506102de60065481565b34801561053757600080fd5b50600054600160a01b900460ff1661031e565b34801561055657600080fd5b5061030c611313565b34801561056b57600080fd5b506102de600e5481565b34801561058157600080fd5b5061030c611348565b34801561059657600080fd5b50600e54600f54604080519283526020830191909152016102bf565b3480156105be57600080fd5b506000546001600160a01b03166102ab565b3480156105dc57600080fd5b5061030c6105eb366004612837565b61137b565b3480156105fc57600080fd5b506102de60085481565b34801561061257600080fd5b506102de60075481565b34801561062857600080fd5b506102ab7f00000000000000000000000079bb3a0ee435f957ce4f54ee8c3cfadc7278da0c81565b34801561065c57600080fd5b5061030c61066b36600461277a565b61141f565b34801561067c57600080fd5b506106856114b3565b604080519586526020860194909452928401919091526060830152608082015260a0016102bf565b3480156106b957600080fd5b5061030c6106c8366004612837565b611654565b3480156106d957600080fd5b506003546102ab906001600160a01b031681565b3480156106f957600080fd5b5061030c61070836600461277a565b611722565b34801561071957600080fd5b506102de600f5481565b34801561072f57600080fd5b506102de60045481565b34801561074557600080fd5b506102ab7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2781565b34801561077957600080fd5b5061030c610788366004612852565b61178b565b34801561079957600080fd5b506102de600a5481565b3480156107af57600080fd5b5061030c6107be366004612837565b611a26565b3480156107cf57600080fd5b506002546102ab906001600160a01b031681565b3480156107ef57600080fd5b5061030c611a84565b6000546001600160a01b03163314610823576040516330cd747160e01b815260040160405180910390fd5b611f408111156108465760405163bbf4268d60e01b815260040160405180910390fd5b600680549082905560408051828152602081018490527f07af09e2b23ebab5dd29fa2271d6ca4795031f308caf26ca605f4a719ffeed6191015b60405180910390a15050565b6000546001600160a01b031633146108b7576040516330cd747160e01b815260040160405180910390fd5b600d80549082905560408051828152602081018490527f814a03795b0034fd29b876d88e84028f2b8f0fb280ad580a5eb2ed8604ff78579101610880565b6040516370a0823160e01b81523060048201526000908190819081906001600160a01b037f00000000000000000000000079bb3a0ee435f957ce4f54ee8c3cfadc7278da0c16906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098691906128c7565b600954909150811580610997575080155b156109ab5750600094859450849350915050565b60006109bb826301e133806128f6565b90506000612710600754856109d09190612918565b6109da91906128f6565b9050806000036109f557506000968796508695509350505050565b60025460405163d06ca61f60e01b81526000916001600160a01b03169063d06ca61f90610a29908590600b90600401612935565b600060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a6e91908101906129a7565b905060008160018351610a819190612a65565b81518110610a9157610a91612a78565b60200260200101519050600061271060045483610aae9190612918565b610ab891906128f6565b9050610ac48582612918565b60025460405163d06ca61f60e01b8152919a506000916001600160a01b039091169063d06ca61f90610afd908d90600c90600401612935565b600060405180830381865afa158015610b1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b4291908101906129a7565b90508060018251610b539190612a65565b81518110610b6357610b63612a78565b602002602001015198508789670de0b6b3a7640000610b829190612918565b610b8c91906128f6565b9a505050505050505050909192565b600260015403610bbe5760405163558a1e0360e11b815260040160405180910390fd5b6002600155600054600160a01b900460ff1615610bee5760405163ab35696f60e01b815260040160405180910390fd5b610c036001600160a01b038316333084611b5d565b60405181815233906001600160a01b038416907f8752a472e571a816aea92eec8dae9baf628e840f4929fbcc2d155e6233ff68a79060200160405180910390a3505060018055565b6000546001600160a01b03163314610c76576040516330cd747160e01b815260040160405180910390fd5b600260015403610c995760405163558a1e0360e11b815260040160405180910390fd5b6002600155610cc4610cb36000546001600160a01b031690565b6001600160a01b0384169083611bce565b505060018055565b600b8181548110610cdc57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610d21576040516330cd747160e01b815260040160405180910390fd5b610d29611c03565b565b6000546001600160a01b03163314610d56576040516330cd747160e01b815260040160405180910390fd5b600880549082905560408051828152602081018490527fb1526092a93c65fcdc17421d27e2e30fcb5aa9b40085e50be17a4b76c3c51c519101610880565b6000546001600160a01b03163314610dbf576040516330cd747160e01b815260040160405180910390fd5b612710811115610de25760405163bbf4268d60e01b815260040160405180910390fd5b600780549082905560408051828152602081018490527f73d25e907c42475438d54845cc12bb5f905b65e5ee3f9ff77c5538d727c20eae9101610880565b600260015403610e435760405163558a1e0360e11b815260040160405180910390fd5b6002600155600054600160a01b900460ff1615610e735760405163ab35696f60e01b815260040160405180910390fd5b600080600080610e84600180611c3a565b9350935093509350336001600160a01b03167f2a86a2dac4c093ea22ea0b6ce2656ba747d1c7c6a105875b1859e73b1dfae4f28585858560095442610ec99190612a8e565b604080519586526020860194909452928401919091526060830152608082015260a00160405180910390a25050600180555050565b600260015403610f215760405163558a1e0360e11b815260040160405180910390fd5b60026001556000546001600160a01b03163314610f51576040516330cd747160e01b815260040160405180910390fd5b600054600160a01b900460ff1615610f7c5760405163ab35696f60e01b815260040160405180910390fd5b6000806000610f8c600080611c3a565b60408051858152602081018590528082018390529051949750929550935033927f215413cf8e7874649b7c0e1223f31958053e2537885c6321cfa7b533fbe33aff928190036060019150a250506001805550565b6000546001600160a01b0316331461100b576040516330cd747160e01b815260040160405180910390fd5b61271081111561102e5760405163bbf4268d60e01b815260040160405180910390fd5b600480549082905561103e611e4b565b60408051828152602081018490527f9b7c115fe6f7f2eebe822f6904be104bd740a447f8821ce8a4a335d98d7d27d79101610880565b6060600c8054806020026020016040519081016040528092919081815260200182805480156110cc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110ae575b5050505050905090565b600d546040516370a0823160e01b81526001600160a01b038381166004830152600092839283928392839290917f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe95803016906370a0823190602401602060405180830381865afa15801561114c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117091906128c7565b6040516370a0823160e01b815230600482015291111595506000906001600160a01b037f00000000000000000000000079bb3a0ee435f957ce4f54ee8c3cfadc7278da0c16906370a0823190602401602060405180830381865afa1580156111dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120091906128c7565b9050612710600754826112139190612918565b61121d91906128f6565b92508260000361123a57506000935083925082915081905061130a565b60025460405163d06ca61f60e01b81526000916001600160a01b03169063d06ca61f9061126e908790600b90600401612935565b600060405180830381865afa15801561128b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112b391908101906129a7565b905080600182516112c49190612a65565b815181106112d4576112d4612a78565b60200260200101519250612710600454846112ef9190612918565b6112f991906128f6565b95506113058684612a65565b945050505b91939590929450565b6000546001600160a01b0316331461133e576040516330cd747160e01b815260040160405180910390fd5b610d296000611ea6565b6000546001600160a01b03163314611373576040516330cd747160e01b815260040160405180910390fd5b610d29611ef6565b6000546001600160a01b031633146113a6576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166113cd5760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ff26ba2f28117abfe606670ce2ad6e62ad96ccd37b6d1406afad3b431c7ae1b5f90600090a35050565b6000546001600160a01b0316331461144a576040516330cd747160e01b815260040160405180910390fd5b61271081111561146d5760405163bbf4268d60e01b815260040160405180910390fd5b600580549082905561147d611e4b565b60408051828152602081018490527f5fd4dd55bd00e4ef8693a73e37974145a97ddf1063426ef2b6d5afcc2d4a94979101610880565b6040516370a0823160e01b815230600482015260009081908190819081906001600160a01b037f00000000000000000000000079bb3a0ee435f957ce4f54ee8c3cfadc7278da0c16906370a0823190602401602060405180830381865afa158015611522573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154691906128c7565b9450612710600754866115599190612918565b61156391906128f6565b93508360000361157e5750600092508291508190508061164d565b60025460405163d06ca61f60e01b81526000916001600160a01b03169063d06ca61f906115b2908890600b90600401612935565b600060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115f791908101906129a7565b905080600182516116089190612a65565b8151811061161857611618612a78565b60200260200101519350612710600454856116339190612918565b61163d91906128f6565b92506116498385612a65565b9150505b9091929394565b6000546001600160a01b0316331461167f576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166116a65760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168490600090a361171e7f00000000000000000000000079bb3a0ee435f957ce4f54ee8c3cfadc7278da0c83611f33565b5050565b6000546001600160a01b0316331461174d576040516330cd747160e01b815260040160405180910390fd5b600980549082905560408051828152602081018490527f4bd0a5299f10ae536da0b7edbbeb4522c96adfaeb7cf675a7396bdbeef8c077a9101610880565b6000546001600160a01b031633146117b6576040516330cd747160e01b815260040160405180910390fd5b8060028110156117d9576040516320db826760e01b815260040160405180910390fd5b7f00000000000000000000000079bb3a0ee435f957ce4f54ee8c3cfadc7278da0c6001600160a01b03168383600081811061181657611816612a78565b905060200201602081019061182b9190612837565b6001600160a01b031614611852576040516320db826760e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe958030168383611889600185612a65565b81811061189857611898612a78565b90506020020160208101906118ad9190612837565b6001600160a01b0316146118d4576040516320db826760e01b815260040160405180910390fd5b60005b818110156119375760008484838181106118f3576118f3612a78565b90506020020160208101906119089190612837565b6001600160a01b03160361192f576040516320db826760e01b815260040160405180910390fd5b6001016118d7565b506000600b80548060200260200160405190810160405280929190818152602001828054801561199057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611972575b505050505090508383600b91906119a89291906126ad565b506119e5848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611f5e92505050565b7f29dd278f044e2c983a4567d336db5954946ae111f22ba8a6ddb9b2cdacee1fa6818585604051611a1893929190612aa1565b60405180910390a150505050565b6000546001600160a01b03163314611a51576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b038116611a785760405163d92e233d60e01b815260040160405180910390fd5b611a8181611ea6565b50565b6000546001600160a01b03163314611aaf576040516330cd747160e01b815260040160405180910390fd5b600260015403611ad25760405163558a1e0360e11b815260040160405180910390fd5b6002600155476000611aec6000546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b36576040519150601f19603f3d011682016040523d82523d6000602084013e611b3b565b606091505b5050905080610cc457604051633d2cec6f60e21b815260040160405180910390fd5b6040516001600160a01b0380851660248301528316604482015260648101829052611bc89085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612027565b50505050565b6040516001600160a01b038316602482015260448101829052611bfe90849063a9059cbb60e01b90606401611b91565b505050565b6000805460ff60a01b1916815560405133917f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91a2565b6000806000808515611c8457600a546009548115801590611c635750611c608183612a8e565b42105b15611c815760405163b0782df760e01b815260040160405180910390fd5b50505b8415611d3457600d546040516370a0823160e01b81523360048201527f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe9580306001600160a01b0316906370a0823190602401602060405180830381865afa158015611cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1591906128c7565b1015611d3457604051635674b7e960e11b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000079bb3a0ee435f957ce4f54ee8c3cfadc7278da0c6001600160a01b0316906370a0823190602401602060405180830381865afa158015611d9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbf91906128c7565b9050600061271060075483611dd49190612918565b611dde91906128f6565b905080600003611e0157604051630fec21fd60e21b815260040160405180910390fd5b6000611e0c82612123565b5090506000611e1b8383612200565b9050600080611e2983612430565b915091508b15611e385742600a555b939b919a50985091965090945050505050565b612710600554600454611e5e9190612a8e565b1115610d295760405162461bcd60e51b815260206004820152601260248201527153706c69742065786365656473203130302560701b60448201526064015b60405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000805460ff60a01b1916600160a01b17815560405133917f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891a2565b611f486001600160a01b03831682600061267d565b61171e6001600160a01b0383168260001961267d565b805160008167ffffffffffffffff811115611f7b57611f7b612991565b604051908082528060200260200182016040528015611fa4578160200160208202803683370190505b50905060005b82811015612013578381611fbf600186612a65565b611fc99190612a65565b81518110611fd957611fd9612a78565b6020026020010151828281518110611ff357611ff3612a78565b6001600160a01b0390921660209283029190910190910152600101611faa565b508051611bc890600c906020840190612710565b600080836001600160a01b0316836040516120429190612b02565b6000604051808303816000865af19150503d806000811461207f576040519150601f19603f3d011682016040523d82523d6000602084013e612084565b606091505b5091509150816120ca5760405162461bcd60e51b8152602060048201526011602482015270115490cc8c0818d85b1b0819985a5b1959607a1b6044820152606401611e9d565b805115611bc857808060200190518101906120e59190612b31565b611bc85760405162461bcd60e51b815260206004820152600f60248201526e115490cc8c081bdc0819985a5b1959608a1b6044820152606401611e9d565b60025460405163d06ca61f60e01b8152600091829182916001600160a01b03169063d06ca61f9061215b908790600b90600401612935565b600060405180830381865afa158015612178573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121a091908101906129a7565b905080600182516121b19190612a65565b815181106121c1576121c1612a78565b6020026020010151915060006006549050612710816127106121e39190612a65565b6121ed9085612918565b6121f791906128f6565b93505050915091565b600254600b8054604080516020808402820181019092528281526000946001600160a01b0316938593919290919083018282801561226757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612249575b50506040516370a0823160e01b81523060048201529394506000936001600160a01b037f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe9580301693506370a0823192506024019050602060405180830381865afa1580156122d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fb91906128c7565b9050826001600160a01b0316635c11d795878785306008544261231e9190612a8e565b6040518663ffffffff1660e01b815260040161233e959493929190612b53565b600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b50506040516370a0823160e01b81523060048201528392507f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe9580306001600160a01b031691506370a0823190602401602060405180830381865afa1580156123d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fa91906128c7565b6124049190612a65565b935084841015612427576040516307dd37f760e41b815260040160405180910390fd5b50505092915050565b60045460055460009182916127106124488387612918565b61245291906128f6565b935060006127106124638388612918565b61246d91906128f6565b905060008161247c8789612a65565b6124869190612a65565b905085156124da576124c26001600160a01b037f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe958030163388611bce565b85600e60008282546124d49190612a8e565b90915550505b6124e48183612a8e565b945084156126745784600f60008282546124fe9190612a8e565b909155505060035461253d906001600160a01b037f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe9580308116911687611bce565b6003546040516001600160a01b037f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe95803081166024830152600092169063226bf2d160e21b9060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516125c29190612b02565b6000604051808303816000865af19150503d80600081146125ff576040519150601f19603f3d011682016040523d82523d6000602084013e612604565b606091505b5050905080612672576003546040518781526001600160a01b037f0000000000000000000000009deeaf046e144fb6304a5acd2af142bbfe95803081169216907f5e5bdd416984c648505f4e35fe3d6fad12be0b82af85b178796220c6a12e33d19060200160405180910390a35b505b50505050915091565b6040516001600160a01b038316602482015260448101829052611bfe90849063095ea7b360e01b90606401611b91565b828054828255906000526020600020908101928215612700579160200282015b828111156127005781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906126cd565b5061270c929150612765565b5090565b828054828255906000526020600020908101928215612700579160200282015b8281111561270057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612730565b5b8082111561270c5760008155600101612766565b60006020828403121561278c57600080fd5b5035919050565b80356001600160a01b03811681146127aa57600080fd5b919050565b600080604083850312156127c257600080fd5b6127cb83612793565b946020939093013593505050565b600081518084526020808501945080840160005b838110156128125781516001600160a01b0316875295820195908201906001016127ed565b509495945050505050565b60208152600061283060208301846127d9565b9392505050565b60006020828403121561284957600080fd5b61283082612793565b6000806020838503121561286557600080fd5b823567ffffffffffffffff8082111561287d57600080fd5b818501915085601f83011261289157600080fd5b8135818111156128a057600080fd5b8660208260051b85010111156128b557600080fd5b60209290920196919550909350505050565b6000602082840312156128d957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008261291357634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761292f5761292f6128e0565b92915050565b60006040820184835260206040818501528185548084526060860191508660005282600020935060005b818110156129845784546001600160a01b03168352600194850194928401920161295f565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156129ba57600080fd5b825167ffffffffffffffff808211156129d257600080fd5b818501915085601f8301126129e657600080fd5b8151818111156129f8576129f8612991565b8060051b604051601f19603f83011681018181108582111715612a1d57612a1d612991565b604052918252848201925083810185019188831115612a3b57600080fd5b938501935b82851015612a5957845184529385019392850192612a40565b98975050505050505050565b8181038181111561292f5761292f6128e0565b634e487b7160e01b600052603260045260246000fd5b8082018082111561292f5761292f6128e0565b604081526000612ab460408301866127d9565b8281036020848101919091528482528591810160005b86811015612af6576001600160a01b03612ae385612793565b1682529282019290820190600101612aca565b50979650505050505050565b6000825160005b81811015612b235760208186018101518583015201612b09565b506000920191825250919050565b600060208284031215612b4357600080fd5b8151801515811461283057600080fd5b85815284602082015260a060408201526000612b7260a08301866127d9565b6001600160a01b039490941660608301525060800152939250505056fea264697066735822122081e63fcfbbbba849bfb55b7021ce751be6469db863e435cb12e2f4f15ac37da564736f6c63430008140033