false
true
0

Contract Address Details

0x616cb6a245Ed4c11216Ec58D10B6A2E87271845d

Token
Gelato (GEL)
Creator
0x608395–80fdaa at 0xa1212f–9a9bc6
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
2,693 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25894965
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Gelato




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




Optimization runs
200
EVM Version
paris




Verified at
2024-12-04T04:34:06.108075Z

Constructor Arguments

0x00000000000000000000000098bf93ebf5c380c0e6ae8e192a7e2ae08edacc02000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9000000000000000000000000eb45a3c4aedd0f47f345fb4c8a1802bb5740d725

Arg [0] (address) : 0x98bf93ebf5c380c0e6ae8e192a7e2ae08edacc02
Arg [1] (address) : 0x165c3410fc91ef562c50559f7d2289febed552d9
Arg [2] (address) : 0xeb45a3c4aedd0f47f345fb4c8a1802bb5740d725

              

Contract source code

//SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

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


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

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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: contracts/Gelato.sol

pragma solidity 0.8.20;



/**
 * Standard SafeMath, stripped down to just add/sub/mul/div
 */
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

/**
 * ERC20 standard interface.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

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

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

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

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface ISOLIDX {
    function burn(uint256 amount) external;
}

interface ISTACKED {
    function burn(uint256 amount) external;
}

interface IDEXFactory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}

interface IDEXRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

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

interface IDividendDistributor {
    function setDistributionCriteria(
        uint256 _minSolidXPeriod,
        uint256 _minSolidXDistribution,
        uint256 _minHexPeriod,
        uint256 _minHexDistribution
    ) external;

    function setShare(address shareholder, uint256 amount) external;

    function depositForSolidXBurn() external payable;

    function depositForStackedBurn() external payable;

    function depositForSolidXReflection() external payable;

    function depositForHexReflection() external payable;

    function processSolidX(uint256 gas) external;

    function processHex(uint256 gas) external;

    function claimDividend() external;
}

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 solidXTotalExcluded;
        uint256 solidXTotalRealised;
        uint256 hexTotalExcluded;
        uint256 hexTotalRealised;
    }

    IERC20 SOLIDX = IERC20(0x8Da17Db850315A34532108f0f5458fc0401525f6);
    IERC20 HEX = IERC20(0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39);
    IERC20 STACKED = IERC20(0x67d8954C2B7386c8Dbf6936Cc2355bA2227F0a8f);
    IERC20 WPLS = IERC20(0xA1077a294dDE1B09bB078844df40758a5D0f9a27);
    address ZERO = 0x0000000000000000000000000000000000000000;
    IDEXRouter public pulseRouterV1;
    IDEXRouter public pulseRouterV2;
    IDEXRouter public nineinchRouter;

    address[] shareholders;
    mapping(address => uint256) shareholderSolidXIndexes;
    mapping(address => uint256) shareholderSolidXClaims;
    mapping(address => uint256) shareholderHexIndexes;
    mapping(address => uint256) shareholderHexClaims;

    mapping(address => Share) public shares;
    uint256 public totalShares;

    // SolidX Trackers
    uint256 currentSolidXIndex;
    uint256 public totalSolidXDividends;
    uint256 public totalSolidXDistributed;
    uint256 public solidXDividendsPerShare;
    uint256 public solidXDividendsPerShareAccuracyFactor = 10 ** 36;
    uint256 public minSolidXPeriod = 1 hours; // min 1 hour delay
    uint256 public minSolidXDistribution = (1 * (10 ** 18)) / 10; // 0.1 SOLIDX minimum auto send
    uint256 public totalSolidXBurned;

    // HEX Dividend Trackers
    uint256 currentHexIndex;
    uint256 public totalHexDividends;
    uint256 public totalHexDistributed;
    uint256 public hexDividendsPerShare;
    uint256 public hexDividendsPerShareAccuracyFactor = 10 ** 36;
    uint256 public minHexPeriod = 1 hours; // min 1 hour delay
    uint256 public minHexDistribution = 100 * (10 ** 8); // 100 HEX minimum auto send

    // Stacked Italian Trackers
    uint256 public totalStackedBurned;

    bool initialized;

    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor(address _pulseRouterV1, address _pulseRouterV2, address _nineinchRouter) {
        pulseRouterV1 = _pulseRouterV1 != address(0)
            ? IDEXRouter(_pulseRouterV1)
            : IDEXRouter(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
        pulseRouterV2 = _pulseRouterV2 != address(0)
            ? IDEXRouter(_pulseRouterV2)
            : IDEXRouter(0x165C3410fC91EF562C50559f7d2289fEbed552d9);
        nineinchRouter = _nineinchRouter != address(0)
            ? IDEXRouter(_nineinchRouter)
            : IDEXRouter(0xeB45a3c4aedd0F47F345fB4c8A1802BB5740d725);
        _token = msg.sender;

        STACKED.approve(address(STACKED), type(uint256).max);
    }

    function setDistributionCriteria(
        uint256 _minSolidXPeriod,
        uint256 _minSolidXDistribution,
        uint256 _minHexPeriod,
        uint256 _minHexDistribution
    ) external override onlyToken {
        minSolidXPeriod = _minSolidXPeriod;
        minSolidXDistribution = _minSolidXDistribution;
        minHexPeriod = _minHexPeriod;
        minHexDistribution = _minHexDistribution;
    }

    function setShare(
        address shareholder,
        uint256 amount
    ) external override onlyToken {
        if (shares[shareholder].amount > 0) {
            distributeSolidXDividend(shareholder);
            distributeHexDividend(shareholder);
        }

        if (amount > 0 && shares[shareholder].amount == 0) {
            addShareholder(shareholder);
        } else if (amount == 0 && shares[shareholder].amount > 0) {
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;

        shares[shareholder].solidXTotalExcluded = getCumulativeSolidXDividends(
            shares[shareholder].amount
        );

        shares[shareholder].hexTotalExcluded = getCumulativeHexDividends(
            shares[shareholder].amount
        );
    }

    function depositForSolidXBurn() external payable override onlyToken {
        uint256 solidXBefore = SOLIDX.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = address(WPLS);
        path[1] = address(SOLIDX);

        nineinchRouter.swapExactETHForTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 solidXGained = SOLIDX.balanceOf(address(this)).sub(
            solidXBefore
        );

        ISOLIDX(address(SOLIDX)).burn(solidXGained);
        totalSolidXBurned = totalSolidXBurned.add(solidXGained);
    }

    function depositForStackedBurn() external payable override onlyToken {
        uint256 stackedBalanceBefore = STACKED.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = address(WPLS);
        path[1] = address(STACKED);

        nineinchRouter.swapExactETHForTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 stackedGained = STACKED.balanceOf(address(this)).sub(
            stackedBalanceBefore
        );

        ISTACKED(address(STACKED)).burn(stackedGained);
        totalStackedBurned = totalStackedBurned.add(stackedGained);
    }

    function depositForSolidXReflection() external payable override onlyToken {
        uint256 solidXBalanceBefore = SOLIDX.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = address(WPLS);
        path[1] = address(SOLIDX);

        nineinchRouter.swapExactETHForTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 solidXGained = SOLIDX.balanceOf(address(this)).sub(
            solidXBalanceBefore
        );

        totalSolidXDividends = totalSolidXDividends.add(solidXGained);
        solidXDividendsPerShare = solidXDividendsPerShare.add(
            solidXDividendsPerShareAccuracyFactor.mul(solidXGained).div(
                totalShares
            )
        );
    }

    function depositForHexReflection() external payable override onlyToken {
        uint256 hexBalanceBefore = HEX.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = address(WPLS);
        path[1] = address(HEX);

        pulseRouterV1.swapExactETHForTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 hexGained = HEX.balanceOf(address(this)).sub(hexBalanceBefore);

        totalHexDividends = totalHexDividends.add(hexGained);
        hexDividendsPerShare = hexDividendsPerShare.add(
            hexDividendsPerShareAccuracyFactor.mul(hexGained).div(totalShares)
        );
    }

    function distributeSolidXDividend(address shareholder) internal {
        if (shares[shareholder].amount == 0) {
            return;
        }

        uint256 amount = getUnpaidSolidXEarnings(shareholder);
        if (amount > 0) {
            totalSolidXDistributed = totalSolidXDistributed.add(amount);
            SOLIDX.transfer(shareholder, amount);
            shareholderSolidXClaims[shareholder] = block.timestamp;
            shares[shareholder].solidXTotalRealised = shares[shareholder]
                .solidXTotalRealised
                .add(amount);
            shares[shareholder]
                .solidXTotalExcluded = getCumulativeSolidXDividends(
                shares[shareholder].amount
            );
        }
    }

    function distributeHexDividend(address shareholder) internal {
        if (shares[shareholder].amount == 0) {
            return;
        }

        uint256 amount = getUnpaidHexEarnings(shareholder);
        if (amount > 0) {
            totalHexDistributed = totalHexDistributed.add(amount);
            HEX.transfer(shareholder, amount);
            shareholderHexClaims[shareholder] = block.timestamp;
            shares[shareholder].hexTotalRealised = shares[shareholder]
                .hexTotalRealised
                .add(amount);
            shares[shareholder].hexTotalExcluded = getCumulativeHexDividends(
                shares[shareholder].amount
            );
        }
    }

    function processSolidX(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if (shareholderCount == 0) {
            return;
        }

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

        uint256 iterations = 0;

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentSolidXIndex >= shareholderCount) {
                currentSolidXIndex = 0;
            }

            if (shouldSolidXDistribute(shareholders[currentSolidXIndex])) {
                distributeSolidXDividend(shareholders[currentSolidXIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentSolidXIndex++;
            iterations++;
        }
    }

    function processHex(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if (shareholderCount == 0) {
            return;
        }

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

        uint256 iterations = 0;

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentHexIndex >= shareholderCount) {
                currentHexIndex = 0;
            }

            if (shouldHexDistribute(shareholders[currentHexIndex])) {
                distributeHexDividend(shareholders[currentHexIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentHexIndex++;
            iterations++;
        }
    }

    function shouldSolidXDistribute(
        address shareholder
    ) internal view returns (bool) {
        return
            shareholderSolidXClaims[shareholder] + minSolidXPeriod <
            block.timestamp &&
            getUnpaidSolidXEarnings(shareholder) > minSolidXDistribution;
    }

    function shouldHexDistribute(
        address shareholder
    ) internal view returns (bool) {
        return
            shareholderHexClaims[shareholder] + minHexPeriod <
            block.timestamp &&
            getUnpaidHexEarnings(shareholder) > minHexDistribution;
    }

    function claimDividend() external override {
        distributeSolidXDividend(msg.sender);
        distributeHexDividend(msg.sender);
    }

    function getUnpaidSolidXEarnings(
        address shareholder
    ) public view returns (uint256) {
        if (shares[shareholder].amount == 0) {
            return 0;
        }

        uint256 shareholderTotalDividends = getCumulativeSolidXDividends(
            shares[shareholder].amount
        );
        uint256 shareholderTotalExcluded = shares[shareholder]
            .solidXTotalExcluded;

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

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getUnpaidHexEarnings(
        address shareholder
    ) public view returns (uint256) {
        if (shares[shareholder].amount == 0) {
            return 0;
        }

        uint256 shareholderTotalDividends = getCumulativeHexDividends(
            shares[shareholder].amount
        );
        uint256 shareholderTotalExcluded = shares[shareholder].hexTotalExcluded;

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

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeSolidXDividends(
        uint256 share
    ) internal view returns (uint256) {
        return
            share.mul(solidXDividendsPerShare).div(
                solidXDividendsPerShareAccuracyFactor
            );
    }

    function getCumulativeHexDividends(
        uint256 share
    ) internal view returns (uint256) {
        return
            share.mul(hexDividendsPerShare).div(
                hexDividendsPerShareAccuracyFactor
            );
    }

    function addShareholder(address shareholder) internal {
        shareholderSolidXIndexes[shareholder] = shareholders.length;
        shareholderHexIndexes[shareholder] = shareholders.length;

        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderSolidXIndexes[shareholder]] = shareholders[
            shareholders.length - 1
        ];
        shareholderSolidXIndexes[
            shareholders[shareholders.length - 1]
        ] = shareholderSolidXIndexes[shareholder];

        shareholders[shareholderHexIndexes[shareholder]] = shareholders[
            shareholders.length - 1
        ];
        shareholderHexIndexes[
            shareholders[shareholders.length - 1]
        ] = shareholderHexIndexes[shareholder];

        shareholders.pop();
    }

    receive() external payable {}
}

contract Gelato is IERC20, ReentrancyGuard, Ownable {
    using SafeMath for uint256;

    address WPLS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
    address SOLIDX = 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56;
    address HEX = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c;
    address STACKED = 0x67d8954C2B7386c8Dbf6936Cc2355bA2227F0a8f;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    string constant _name = "Gelato";
    string constant _symbol = "GEL";
    uint8 constant _decimals = 18;

    uint256 _totalSupply = 8888888888000000000000000000; // 8,888,888,888
    uint256 public _maxTxAmount = _totalSupply / 100; // 1%

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

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isTxLimitExempt;
    mapping(address => bool) public isDividendExempt;

    uint256 public solidXBurnFee = 1000;
    uint256 public stackedBurnFee = 1500;
    uint256 public gelatoBurnFee = 2500;
    uint256 public genesisFee = 500;
    uint256 public solidXReflectionFee = 1500;
    uint256 public hexReflectionFee = 1500;
    uint256 public liquidityFee = 1500;
    uint256 public totalBuyFee = 4000;
    uint256 public totalSellFee = 4000;
    uint256 feeDenominator = 10000;
    bool public feesOnNormalTransfers = false;

    address public autoLiquidityReceiver;
    address public genesisReceiver;

    IDEXRouter public pulseRouterV1;
    IDEXRouter public pulseRouterV2;
    IDEXRouter public nineinchRouter;

    address pulseV2Pair;
    address[] public pairs;

    uint256 public launchedAt;

    DividendDistributor public distributor;
    uint256 distributorSolidXGas = 500000;
    uint256 distributorHexGas = 500000;

    bool public swapEnabled = true;
    uint256 public swapThreshold = _totalSupply / 5000; // 0.02%
    bool inSwap;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    uint256 public totalGelBurned;
    uint256 public totalPlsLpAdded;
    uint256 public totalGelLpAdded;

    constructor(
        address _pulseRouterV1,
        address _pulseRouterV2,
        address _nineinchRouter
    ) Ownable(msg.sender) {
        pulseRouterV1 = _pulseRouterV1 != address(0)
            ? IDEXRouter(_pulseRouterV1)
            : IDEXRouter(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
        pulseRouterV2 = _pulseRouterV2 != address(0)
            ? IDEXRouter(_pulseRouterV2)
            : IDEXRouter(0x165C3410fC91EF562C50559f7d2289fEbed552d9);
        nineinchRouter = _nineinchRouter != address(0)
            ? IDEXRouter(_nineinchRouter)
            : IDEXRouter(0xeB45a3c4aedd0F47F345fB4c8A1802BB5740d725);
        pulseV2Pair = IDEXFactory(pulseRouterV2.factory()).createPair(
            WPLS,
            address(this)
        );
        _allowances[address(this)][address(pulseRouterV1)] = type(uint256).max;
        _allowances[address(this)][address(pulseRouterV2)] = type(uint256).max;
        _allowances[address(this)][address(nineinchRouter)] = type(uint256).max;

        pairs.push(pulseV2Pair);
        distributor = new DividendDistributor(_pulseRouterV1, _pulseRouterV2, _nineinchRouter);

        address owner_ = msg.sender;

        isFeeExempt[owner_] = true;
        isTxLimitExempt[owner_] = true;
        isDividendExempt[pulseV2Pair] = true;
        isDividendExempt[address(this)] = true;
        isFeeExempt[address(this)] = true;
        isTxLimitExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;

        autoLiquidityReceiver = owner_;
        genesisReceiver = owner_;

        _balances[owner_] = _totalSupply;
        emit Transfer(address(0), owner_, _totalSupply);
    }

    receive() external payable {}

    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    function name() external pure override returns (string memory) {
        return _name;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function allowance(
        address holder,
        address spender
    ) external view override returns (uint256) {
        return _allowances[holder][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function transfer(
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        if (_allowances[sender][msg.sender] != ~uint256(0)) {
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender]
                .sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        require(launchedAt > 0 || tx.origin == owner(), "The contract is not launched yet");

        if (inSwap) {
            return _basicTransfer(sender, recipient, amount);
        }

        checkTxLimit(sender, recipient, amount);

        if (shouldSwapBack()) {
            swapBack();
        }

        _balances[sender] = _balances[sender].sub(
            amount,
            "Insufficient Balance"
        );

        uint256 amountReceived = shouldTakeFee(sender, recipient)
            ? takeFee(sender, recipient, amount)
            : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);

        if (!isDividendExempt[sender]) {
            try distributor.setShare(sender, _balances[sender]) {} catch {}
        }
        if (!isDividendExempt[recipient]) {
            try
                distributor.setShare(recipient, _balances[recipient])
            {} catch {}
        }

        try distributor.processSolidX(distributorSolidXGas) {} catch {}

        try distributor.processHex(distributorHexGas) {} catch {}

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(
            amount,
            "Insufficient Balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function checkTxLimit(address sender, address recipient, uint256 amount) internal view {
        require(
            amount <= _maxTxAmount || isTxLimitExempt[sender] || isTxLimitExempt[recipient],
            "TX Limit Exceeded"
        );
    }

    function shouldTakeFee(
        address sender,
        address recipient
    ) internal view returns (bool) {
        if (isFeeExempt[sender] || isFeeExempt[recipient] || launchedAt == 0)
            return false;

        address[] memory liqPairs = pairs;

        for (uint256 i = 0; i < liqPairs.length; i++) {
            if (sender == liqPairs[i] || recipient == liqPairs[i]) return true;
        }

        return feesOnNormalTransfers;
    }

    function getTotalFee(bool selling) public view returns (uint256) {
        if (launchedAt == 0) {
            return feeDenominator.sub(1);
        }
        return selling ? totalSellFee : totalBuyFee;
    }

    function takeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (uint256) {
        uint256 feeAmount = amount.mul(getTotalFee(isSell(recipient))).div(
            feeDenominator.mul(10)
        );

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function isSell(address recipient) internal view returns (bool) {
        address[] memory liqPairs = pairs;
        for (uint256 i = 0; i < liqPairs.length; i++) {
            if (recipient == liqPairs[i]) return true;
        }
        return false;
    }

    function shouldSwapBack() internal view returns (bool) {
        return
            msg.sender != pulseV2Pair &&
            !inSwap &&
            swapEnabled &&
            _balances[address(this)] >= swapThreshold;
    }

    function swapBack() internal swapping {
        uint256 amountGelLiquidity = swapThreshold
            .mul(liquidityFee.div(2))
            .div(feeDenominator);

        uint256 amountGelBurn = swapThreshold
            .mul(gelatoBurnFee)
            .div(feeDenominator);

        uint256 amountGelGenesis = swapThreshold
            .mul(genesisFee)
            .div(feeDenominator);

        if (amountGelBurn > 0) {
            _transferFrom(address(this), ZERO, amountGelBurn);
            totalGelBurned = totalGelBurned.add(amountGelBurn);
        }

        if (amountGelGenesis > 0) {
            _transferFrom(address(this), genesisReceiver, amountGelGenesis);
        }

        uint256 amountGelSwap = swapThreshold
            .sub(amountGelLiquidity)
            .sub(amountGelBurn)
            .sub(amountGelGenesis);

        uint256 balanceBefore = address(this).balance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = address(WPLS);

        try
            pulseRouterV2.swapExactTokensForETHSupportingFeeOnTransferTokens(
                amountGelSwap,
                0,
                path,
                address(this),
                block.timestamp
            )
        {
            uint256 amountPls = address(this).balance.sub(balanceBefore);

            uint256 amountPlsLiquidity = amountPls
                .mul(liquidityFee.div(2))
                .div(feeDenominator.sub(liquidityFee.div(2)).sub(gelatoBurnFee).sub(genesisFee));

            uint256 amountSolidXBurn = amountPls
                .mul(solidXBurnFee)
                .div(feeDenominator.sub(liquidityFee.div(2)).sub(gelatoBurnFee).sub(genesisFee));

            uint256 amountStackedBurn = amountPls
                .mul(stackedBurnFee)
                .div(feeDenominator.sub(liquidityFee.div(2)).sub(gelatoBurnFee).sub(genesisFee));

            uint256 amountSolidXReflection = amountPls
                .mul(solidXReflectionFee)
                .div(feeDenominator.sub(liquidityFee.div(2)).sub(gelatoBurnFee).sub(genesisFee));

            uint256 amountHexReflection = amountPls
                .mul(hexReflectionFee)
                .div(feeDenominator.sub(liquidityFee.div(2)).sub(gelatoBurnFee).sub(genesisFee));

            if (amountGelLiquidity > 0) {
                try
                    pulseRouterV2.addLiquidityETH{value: amountPlsLiquidity}(
                        address(this),
                        amountGelLiquidity,
                        0,
                        amountPlsLiquidity,
                        autoLiquidityReceiver,
                        block.timestamp
                    )
                {
                    totalPlsLpAdded = totalPlsLpAdded.add(amountPlsLiquidity);
                    totalGelLpAdded = totalGelLpAdded.add(amountGelLiquidity);
                    emit AutoLiquify(amountGelLiquidity, amountPlsLiquidity);
                } catch {
                    emit AutoLiquify(0, 0);
                }                
            }

            if (amountSolidXBurn > 0) {
                try
                    distributor.depositForSolidXBurn{value: amountSolidXBurn}()
                {} catch {}
            }

            if (amountStackedBurn > 0) {
                try
                    distributor.depositForStackedBurn{
                        value: amountStackedBurn
                    }()
                {} catch {}
            }

            if (amountSolidXReflection > 0) {
                try
                    distributor.depositForSolidXReflection{
                        value: amountSolidXReflection
                    }()
                {} catch {}
            }

            if (amountHexReflection > 0) {
                try
                    distributor.depositForHexReflection{
                        value: amountHexReflection
                    }()
                {} catch {}
            }

            // Any dust amounts of PLS in contract gets sent to owner for good accounting
            if (address(this).balance > 0) {
                (bool success, ) = payable(owner()).call{value: address(this).balance, gas: 30000}(
                    ""
                );
                success;
            }

            emit SwapBackSuccess(amountGelSwap);
        } catch Error(string memory e) {
            emit SwapBackFailed(
                string(abi.encodePacked("SwapBack failed with error ", e))
            );
        } catch {
            emit SwapBackFailed(
                "SwapBack failed without an error message from PulseX"
            );
        }
    }

    function launch() external onlyOwner {
        require(launchedAt == 0, "Already launched.");
        launchedAt = block.timestamp;
        emit Launched(block.number, block.timestamp);
    }

    function setTxLimit(
        uint256 amount
    ) external onlyOwner {
        require(amount >= _totalSupply / 2000);
        _maxTxAmount = amount;
    }

    function setIsDividendExempt(
        address holder,
        bool exempt
    ) external onlyOwner {
        require(holder != address(this) && holder != pulseV2Pair);
        isDividendExempt[holder] = exempt;
        if (exempt) {
            distributor.setShare(holder, 0);
        } else {
            distributor.setShare(holder, _balances[holder]);
        }
    }

    function setIsFeeExempt(
        address holder,
        bool exempt
    ) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setIsTxLimitExempt(
        address holder,
        bool exempt
    ) external onlyOwner {
        isTxLimitExempt[holder] = exempt;
    }

    function setFees(
        uint256 _solidXBurnFee,
        uint256 _stackedBurnFee,
        uint256 _gelatoBurnFee,
        uint256 _genesisFee,
        uint256 _solidXReflectionFee,
        uint256 _hexReflectionFee,
        uint256 _liquidityFee,
        uint256 _totalBuyFee,
        uint256 _totalSellFee,
        bool _feesOnNormalTransfers
    ) external onlyOwner {
        solidXBurnFee = _solidXBurnFee;
        stackedBurnFee = _stackedBurnFee;
        gelatoBurnFee = _gelatoBurnFee;
        genesisFee = _genesisFee;
        solidXReflectionFee = _solidXReflectionFee;
        hexReflectionFee = _hexReflectionFee;
        liquidityFee = _liquidityFee;
        totalBuyFee = _totalBuyFee;
        totalSellFee = _totalSellFee;
        require(genesisFee <= 500, "5 percent max.");
        require(
            solidXBurnFee
                .add(stackedBurnFee)
                .add(gelatoBurnFee)
                .add(genesisFee)
                .add(solidXReflectionFee)
                .add(hexReflectionFee)
                .add(liquidityFee) <= feeDenominator,
            "The total of all combined fees must be 10000 for 100 percent."
        );
        require(totalBuyFee <= feeDenominator, "Buy fee too high");
        require(totalSellFee <= feeDenominator, "Sell fee too high");

        feesOnNormalTransfers = _feesOnNormalTransfers;
    }

    function setLiquidityFeeReceiver(
        address _autoLiquidityReceiver
    ) external onlyOwner {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        
        emit ParameterUpdated();
    }

    function setGenesisReceiver(address _newGenesis) external onlyOwner {
        genesisReceiver = _newGenesis;

        emit ParameterUpdated();
    }

    function setSwapBackSettings(
        bool _enabled,
        uint256 _amount
    ) external onlyOwner {
        swapEnabled = _enabled;
        swapThreshold = _amount;

        emit ParameterUpdated();
    }

    function setDistributionCriteria(
        uint256 _minSolidXPeriod,
        uint256 _minSolidXDistribution,
        uint256 _minHexPeriod,
        uint256 _minHexDistribution
    ) external onlyOwner {
        distributor.setDistributionCriteria(
            _minSolidXPeriod,
            _minSolidXDistribution,
            _minHexPeriod,
            _minHexDistribution
        );

        emit ParameterUpdated();
    }

    function setDistributorSettings(
        uint256 solidXGas,
        uint256 hexGas
    ) external onlyOwner {
        distributorSolidXGas = solidXGas;
        distributorHexGas = hexGas;
        require(
            distributorSolidXGas <= 1000000 && distributorHexGas <= 1000000,
            "Max gas is 1000000"
        );

        emit ParameterUpdated();
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    function claimDividend() external {
        distributor.claimDividend();
    }

    function addPair(
        address pair
    ) external onlyOwner {
        pairs.push(pair);

        emit ParameterUpdated();
    }

    function removeLastPair()
        external
        onlyOwner
    {
        pairs.pop();

        emit ParameterUpdated();
    }

    event AutoLiquify(uint256 amountWPLS, uint256 amountGEL);
    event Launched(uint256 blockNumber, uint256 timestamp);
    event ParameterUpdated();
    event SwapBackSuccess(uint256 amount);
    event SwapBackFailed(string message);
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_pulseRouterV1","internalType":"address"},{"type":"address","name":"_pulseRouterV2","internalType":"address"},{"type":"address","name":"_nineinchRouter","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"ReentrancyGuardReentrantCall","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":"AutoLiquify","inputs":[{"type":"uint256","name":"amountWPLS","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountGEL","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Launched","inputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","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":"ParameterUpdated","inputs":[],"anonymous":false},{"type":"event","name":"SwapBackFailed","inputs":[{"type":"string","name":"message","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"SwapBackSuccess","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addPair","inputs":[{"type":"address","name":"pair","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","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":"address","name":"","internalType":"address"}],"name":"autoLiquidityReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimDividend","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract DividendDistributor"}],"name":"distributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"feesOnNormalTransfers","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gelatoBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"genesisFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"genesisReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalFee","inputs":[{"type":"bool","name":"selling","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"hexReflectionFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isDividendExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFeeExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isTxLimitExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchedAt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"nineinchRouter","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":"pairs","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"pulseRouterV1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"pulseRouterV2","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLastPair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minSolidXPeriod","internalType":"uint256"},{"type":"uint256","name":"_minSolidXDistribution","internalType":"uint256"},{"type":"uint256","name":"_minHexPeriod","internalType":"uint256"},{"type":"uint256","name":"_minHexDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorSettings","inputs":[{"type":"uint256","name":"solidXGas","internalType":"uint256"},{"type":"uint256","name":"hexGas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_solidXBurnFee","internalType":"uint256"},{"type":"uint256","name":"_stackedBurnFee","internalType":"uint256"},{"type":"uint256","name":"_gelatoBurnFee","internalType":"uint256"},{"type":"uint256","name":"_genesisFee","internalType":"uint256"},{"type":"uint256","name":"_solidXReflectionFee","internalType":"uint256"},{"type":"uint256","name":"_hexReflectionFee","internalType":"uint256"},{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_totalBuyFee","internalType":"uint256"},{"type":"uint256","name":"_totalSellFee","internalType":"uint256"},{"type":"bool","name":"_feesOnNormalTransfers","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGenesisReceiver","inputs":[{"type":"address","name":"_newGenesis","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidityFeeReceiver","inputs":[{"type":"address","name":"_autoLiquidityReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTxLimit","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"solidXBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"solidXReflectionFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stackedBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBuyFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalGelBurned","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalGelLpAdded","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalPlsLpAdded","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSellFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x6080604052600280546001600160a01b031990811673a1077a294dde1b09bb078844df40758a5d0f9a271790915560038054821673e9e7cea3dedca5984780bafc599bd69add087d5617905560048054821673bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c1790556005805482167367d8954c2b7386c8dbf6936cc2355ba2227f0a8f17905560068054821661dead1790556007805490911690556b1cb8b7702ae75fb695e000006008819055620000bc90606490620005a7565b6009556103e8600f556105dc60108190556109c46011556101f460125560138190556014819055601555610fa060168190556017556127106018556019805460ff199081169091556207a12060228190556023556024805490911660011790556008546200012e9061138890620005a7565b6025553480156200013e57600080fd5b506040516200502b3803806200502b8339810160408190526200016191620005e7565b600160005533806200018d57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620001988162000547565b506001600160a01b038316620001c3577398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02620001c5565b825b601b80546001600160a01b0319166001600160a01b039283161790558216620002035773165c3410fc91ef562c50559f7d2289febed552d962000205565b815b601c80546001600160a01b0319166001600160a01b039283161790558116620002435773eb45a3c4aedd0f47f345fb4c8a1802bb5740d72562000245565b805b601d80546001600160a01b0319166001600160a01b03928316179055601c546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015620002a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ca919062000631565b6002546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c65396906044016020604051808303816000875af11580156200031c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000342919062000631565b601e80546001600160a01b03199081166001600160a01b03938416178255306000908152600b60209081526040808320601b548716845290915280822060001990819055601c5486168352818320819055601d5486168352818320559254601f805460018101825592527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d80790910180549190941691161790915551839083908390620003ee9062000599565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156200042b573d6000803e3d6000fd5b50602180546001600160a01b03199081166001600160a01b0393841617909155336000818152600c60208181526040808420805460ff199081166001908117909255600d8085528387208054831684179055601e548a168752600e808652848820805484168517905530885284882080548416851790559585528387208054831684179055845282862080548216831790556006549098168552928252808420805490971690921790955560198054610100600160a81b0319166101008502179055601a80549094168317909355600854828252600a85528382208190559251928352909283927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050505062000656565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ec7806200316483390190565b600082620005c557634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160a01b0381168114620005e257600080fd5b919050565b600080600060608486031215620005fd57600080fd5b6200060884620005ca565b92506200061860208501620005ca565b91506200062860408501620005ca565b90509250925092565b6000602082840312156200064457600080fd5b6200064f82620005ca565b9392505050565b612afe80620006666000396000f3fe6080604052600436106103535760003560e01c806379f7c50a116101c6578063c2b7bbb6116100f7578063e0df99e811610095578063f2fde38b1161006f578063f2fde38b146109a7578063f708a64f146109c7578063f84ba65d146109e7578063fc06a95914610a0757600080fd5b8063e0df99e81461095c578063f0fc6bca14610972578063f1f3bca31461098757600080fd5b8063d22b98a1116100d1578063d22b98a1146108c0578063dd62ed3e146108d6578063df20fd491461091c578063e0bf82ec1461093c57600080fd5b8063c2b7bbb61461085b578063ca33e64c1461087b578063cbaad20a146108a057600080fd5b806398118cb411610164578063b91ac7881161013e578063b91ac788146107ef578063bf56b3711461080f578063bfc485c514610825578063bfe109281461083b57600080fd5b806398118cb4146107a35780639d9241ec146107b9578063a9059cbb146107cf57600080fd5b80638d5396e9116101a05780638d5396e9146107235780638da5cb5b146107435780638e9b4c671461076157806395d89b411461077757600080fd5b806379f7c50a146106c75780637d1db4a5146106dd5780638b42507f146106f357600080fd5b80633f4218e0116102a05780635c85974f1161023e5780636ddd1713116102185780636ddd17131461064257806370a082311461065c578063715018a61461069257806379c36d9f146106a757600080fd5b80635c85974f146105e2578063658d4b7f146106025780636d2b49401461062257600080fd5b80634f15999a1161027a5780634f15999a1461057c57806358c6eb2e1461059c57806359b107b9146105b25780635abe6711146105c857600080fd5b80633f4218e0146105065780634355855a146105365780634ce027fe1461056657600080fd5b80631865009d1161030d5780632b112e49116102e75780632b112e491461049f5780632f6ec43a146104b4578063313ce567146104ca5780633190bb8a146104e657600080fd5b80631865009d1461043157806323b872dd1461044757806326041bf61461046757600080fd5b806293dc141461035f57806301339c21146103765780630445b6671461038b57806306fdde03146103b4578063095ea7b3146103ec57806318160ddd1461041c57600080fd5b3661035a57005b600080fd5b34801561036b57600080fd5b50610374610a27565b005b34801561038257600080fd5b50610374610a7c565b34801561039757600080fd5b506103a160255481565b6040519081526020015b60405180910390f35b3480156103c057600080fd5b5060408051808201909152600681526547656c61746f60d01b60208201525b6040516103ab91906125cd565b3480156103f857600080fd5b5061040c61040736600461261c565b610b0e565b60405190151581526020016103ab565b34801561042857600080fd5b506008546103a1565b34801561043d57600080fd5b506103a160275481565b34801561045357600080fd5b5061040c610462366004612646565b610b7b565b34801561047357600080fd5b50601a54610487906001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b3480156104ab57600080fd5b506103a1610c3d565b3480156104c057600080fd5b506103a160285481565b3480156104d657600080fd5b50604051601281526020016103ab565b3480156104f257600080fd5b50610374610501366004612682565b610c8f565b34801561051257600080fd5b5061040c610521366004612682565b600c6020526000908152604090205460ff1681565b34801561054257600080fd5b5061040c610551366004612682565b600e6020526000908152604090205460ff1681565b34801561057257600080fd5b506103a160115481565b34801561058857600080fd5b50601c54610487906001600160a01b031681565b3480156105a857600080fd5b506103a160105481565b3480156105be57600080fd5b506103a160165481565b3480156105d457600080fd5b5060195461040c9060ff1681565b3480156105ee57600080fd5b506103746105fd36600461269d565b610cd1565b34801561060e57600080fd5b5061037461061d3660046126c6565b610cfa565b34801561062e57600080fd5b50601d54610487906001600160a01b031681565b34801561064e57600080fd5b5060245461040c9060ff1681565b34801561066857600080fd5b506103a1610677366004612682565b6001600160a01b03166000908152600a602052604090205490565b34801561069e57600080fd5b50610374610d2d565b3480156106b357600080fd5b506103746106c23660046126f9565b610d41565b3480156106d357600080fd5b506103a160295481565b3480156106e957600080fd5b506103a160095481565b3480156106ff57600080fd5b5061040c61070e366004612682565b600d6020526000908152604090205460ff1681565b34801561072f57600080fd5b50601b54610487906001600160a01b031681565b34801561074f57600080fd5b506001546001600160a01b0316610487565b34801561076d57600080fd5b506103a1600f5481565b34801561078357600080fd5b5060408051808201909152600381526211d15360ea1b60208201526103df565b3480156107af57600080fd5b506103a160155481565b3480156107c557600080fd5b506103a160175481565b3480156107db57600080fd5b5061040c6107ea36600461261c565b610f16565b3480156107fb57600080fd5b5061048761080a36600461269d565b610f23565b34801561081b57600080fd5b506103a160205481565b34801561083157600080fd5b506103a160145481565b34801561084757600080fd5b50602154610487906001600160a01b031681565b34801561086757600080fd5b50610374610876366004612682565b610f4d565b34801561088757600080fd5b506019546104879061010090046001600160a01b031681565b3480156108ac57600080fd5b506103746108bb366004612682565b610fb7565b3480156108cc57600080fd5b506103a160135481565b3480156108e257600080fd5b506103a16108f1366004612774565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b34801561092857600080fd5b5061037461093736600461279e565b610ff4565b34801561094857600080fd5b506103746109573660046127ba565b61102a565b34801561096857600080fd5b506103a160125481565b34801561097e57600080fd5b506103746110c2565b34801561099357600080fd5b506103a16109a23660046127ec565b61112c565b3480156109b357600080fd5b506103746109c2366004612682565b61115b565b3480156109d357600080fd5b506103746109e23660046126c6565b611199565b3480156109f357600080fd5b50610374610a023660046126c6565b6112b2565b348015610a1357600080fd5b50610374610a22366004612807565b6112e5565b610a2f61136b565b601f805480610a4057610a40612829565b600082815260208120820160001990810180546001600160a01b0319169055909101909155604051600080516020612aa98339815191529190a1565b610a8461136b565b60205415610acd5760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c903630bab731b432b21760791b60448201526064015b60405180910390fd5b42602081815560408051438152918201929092527f87dcd6626ffde0faf682a10e7b64aff36ea73a5470d5fa6cc7ebd372e4b19001910160405180910390a1565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b699086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383166000908152600b6020908152604080832033845290915281205460001914610c28576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600b82528381203382529091529190912054610c03918490611398565b6001600160a01b0385166000908152600b602090815260408083203384529091529020555b610c338484846113d2565b90505b9392505050565b6007546001600160a01b03166000908152600a6020526040812054610c8a906006546001600160a01b03166000908152600a6020526040902054610c849060085490611779565b90611779565b905090565b610c9761136b565b60198054610100600160a81b0319166101006001600160a01b03841602179055604051600080516020612aa983398151915290600090a150565b610cd961136b565b6107d0600854610ce99190612855565b811015610cf557600080fd5b600955565b610d0261136b565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b610d3561136b565b610d3f60006117bb565b565b610d4961136b565b600f8a9055601089905560118890556012879055601386905560148590556015849055601683905560178290556101f4871115610db95760405162461bcd60e51b815260206004820152600e60248201526d1a903832b931b2b73a1036b0bc1760911b6044820152606401610ac4565b601854610df7601554610df1601454610df1601354610df1601254610df1601154610df1601054600f5461180d90919063ffffffff16565b9061180d565b1115610e6b5760405162461bcd60e51b815260206004820152603d60248201527f54686520746f74616c206f6620616c6c20636f6d62696e65642066656573206d60448201527f75737420626520313030303020666f72203130302070657263656e742e0000006064820152608401610ac4565b6018546016541115610eb25760405162461bcd60e51b815260206004820152601060248201526f084eaf240cccaca40e8dede40d0d2ced60831b6044820152606401610ac4565b6018546017541115610efa5760405162461bcd60e51b81526020600482015260116024820152700a6cad8d840cccaca40e8dede40d0d2ced607b1b6044820152606401610ac4565b6019805460ff1916911515919091179055505050505050505050565b6000610c363384846113d2565b601f8181548110610f3357600080fd5b6000918252602090912001546001600160a01b0316905081565b610f5561136b565b601f805460018101825560009182527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180546001600160a01b0319166001600160a01b038416179055604051600080516020612aa98339815191529190a150565b610fbf61136b565b601a80546001600160a01b0319166001600160a01b038316179055604051600080516020612aa983398151915290600090a150565b610ffc61136b565b6024805460ff19168315151790556025819055604051600080516020612aa983398151915290600090a15050565b61103261136b565b60215460405163382fe0bb60e21b8152600481018690526024810185905260448101849052606481018390526001600160a01b039091169063e0bf82ec90608401600060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b5050604051600080516020612aa9833981519152925060009150a150505050565b602160009054906101000a90046001600160a01b03166001600160a01b031663f0fc6bca6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b50505050565b600060205460000361114657601854610b75906001611779565b8161115357601654610b75565b505060175490565b61116361136b565b6001600160a01b03811661118d57604051631e4fbdf760e01b815260006004820152602401610ac4565b611196816117bb565b50565b6111a161136b565b6001600160a01b03821630148015906111c85750601e546001600160a01b03838116911614155b6111d157600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff1916821580159190911790915561126957602154604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b15801561124d57600080fd5b505af1158015611261573d6000803e3d6000fd5b505050505050565b6021546001600160a01b038381166000818152600a602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401611233565b6112ba61136b565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6112ed61136b565b60228290556023819055620f4240821180159061130f5750620f424060235411155b6113505760405162461bcd60e51b815260206004820152601260248201527104d61782067617320697320313030303030360741b6044820152606401610ac4565b604051600080516020612aa983398151915290600090a15050565b6001546001600160a01b03163314610d3f5760405163118cdaa760e01b8152336004820152602401610ac4565b600081848411156113bc5760405162461bcd60e51b8152600401610ac491906125cd565b5060006113c98486612877565b95945050505050565b60008060205411806113ee57506001546001600160a01b031632145b61143a5760405162461bcd60e51b815260206004820181905260248201527f54686520636f6e7472616374206973206e6f74206c61756e63686564207965746044820152606401610ac4565b60265460ff16156114575761145084848461186c565b9050610c36565b611462848484611952565b61146a6119e3565b1561147757611477611a32565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387166000908152600a90915291909120546114c9918490611398565b6001600160a01b0385166000908152600a60205260408120919091556114ef85856121eb565b6114f95782611504565b611504858585612341565b6001600160a01b0385166000908152600a602052604090205490915061152a908261180d565b6001600160a01b038086166000908152600a60209081526040808320949094559188168152600e909152205460ff166115ce576021546001600160a01b038681166000818152600a602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b1580156115bb57600080fd5b505af19250505080156115cc575060015b505b6001600160a01b0384166000908152600e602052604090205460ff1661165f576021546001600160a01b038581166000818152600a602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561164c57600080fd5b505af192505050801561165d575060015b505b602154602254604051639946b1d760e01b81526001600160a01b0390921691639946b1d7916116949160040190815260200190565b600060405180830381600087803b1580156116ae57600080fd5b505af19250505080156116bf575060015b5060215460235460405163097bd57d60e31b81526001600160a01b0390921691634bdeabe8916116f59160040190815260200190565b600060405180830381600087803b15801561170f57600080fd5b505af1925050508015611720575060015b50836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161176691815260200190565b60405180910390a3506001949350505050565b6000610c3683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611398565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061181a838561288a565b905083811015610c365760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ac4565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600a909152918220546118bd918490611398565b6001600160a01b038086166000908152600a602052604080822093909355908516815220546118ec908361180d565b6001600160a01b038085166000818152600a602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906119409086815260200190565b60405180910390a35060019392505050565b6009548111158061197b57506001600160a01b0383166000908152600d602052604090205460ff165b8061199e57506001600160a01b0382166000908152600d602052604090205460ff165b6119de5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610ac4565b505050565b601e546000906001600160a01b03163314801590611a04575060265460ff16155b8015611a12575060245460ff165b8015610c8a575050602554306000908152600a6020526040902054101590565b6026805460ff19166001179055601854601554600091611a6a91611a6490611a5b9060026123f3565b60255490612435565b906123f3565b90506000611a8b601854611a6460115460255461243590919063ffffffff16565b90506000611aac601854611a6460125460255461243590919063ffffffff16565b90508115611ade57600754611acc9030906001600160a01b0316846113d2565b50602754611ada908361180d565b6027555b8015611afe57601a54611afc9030906001600160a01b0316836113d2565b505b6000611b1d82610c8485610c848860255461177990919063ffffffff16565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110611b5757611b5761289d565b6001600160a01b039283166020918202929092010152600254825191169082906001908110611b8857611b8861289d565b6001600160a01b039283166020918202929092010152601c5460405163791ac94760e01b815291169063791ac94790611bce9086906000908690309042906004016128b3565b600060405180830381600087803b158015611be857600080fd5b505af1925050508015611bf9575060015b611d0957611c05612924565b806308c379a003611c7e5750611c1961297b565b80611c245750611c80565b7fc41a20ad8c23d3903584975786330c6ec73ccfcc657629f10237b792268b0e0281604051602001611c569190612a05565b60408051601f1981840301815290829052611c70916125cd565b60405180910390a1506121d9565b505b7fc41a20ad8c23d3903584975786330c6ec73ccfcc657629f10237b792268b0e02604051611cfc9060208082526034908201527f537761704261636b206661696c656420776974686f757420616e206572726f72604082015273040dacae6e6c2ceca40cce4deda40a0ead8e6cab60631b606082015260800190565b60405180910390a16121d9565b6000611d154784611779565b90506000611d63611d4a601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b60185490611779565b601554611a6490611d5c9060026123f3565b8590612435565b90506000611d9d611d8f601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b600f54611a64908690612435565b90506000611dd7611dc9601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b601054611a64908790612435565b90506000611e11611e03601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b601354611a64908890612435565b90506000611e4b611e3d601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b601454611a64908990612435565b90508b15611f8457601c5460195460405163f305d71960e01b8152306004820152602481018f905260006044820152606481018890526001600160a01b03610100909204821660848201524260a482015291169063f305d71990879060c40160606040518083038185885af193505050508015611ee5575060408051601f3d908101601f19168201909252611ee291810190612a4a565b60015b611f275760408051600080825260208201527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506910160405180910390a1611f84565b5050602854611f3791508661180d565b602855602954611f47908d61180d565b602955604080518d8152602081018790527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506910160405180910390a15b8315611fee57602160009054906101000a90046001600160a01b03166001600160a01b031663ef7c3a39856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611fda57600080fd5b505af193505050508015611fec575060015b505b821561205857602160009054906101000a90046001600160a01b03166001600160a01b03166389ed7965846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561204457600080fd5b505af193505050508015612056575060015b505b81156120c257602160009054906101000a90046001600160a01b03166001600160a01b03166317515488836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120ae57600080fd5b505af1935050505080156120c0575060015b505b801561212c57602160009054906101000a90046001600160a01b03166001600160a01b0316631adb88b3826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561211857600080fd5b505af19350505050801561212a575060015b505b471561219f5760006121466001546001600160a01b031690565b6001600160a01b03164761753090604051600060405180830381858888f193505050503d8060008114612195576040519150601f19603f3d011682016040523d82523d6000602084013e61219a565b606091505b505050505b6040518981527fb39214ef4f33ea2d9d329fb67a4f17e7588bf6e00ed15a7967137ba819697a279060200160405180910390a15050505050505b50506026805460ff1916905550505050565b6001600160a01b0382166000908152600c602052604081205460ff168061222a57506001600160a01b0382166000908152600c602052604090205460ff165b806122355750602054155b1561224257506000610b75565b6000601f80548060200260200160405190810160405280929190818152602001828054801561229a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161227c575b5050505050905060005b8151811015612332578181815181106122bf576122bf61289d565b60200260200101516001600160a01b0316856001600160a01b0316148061231057508181815181106122f3576122f361289d565b60200260200101516001600160a01b0316846001600160a01b0316145b1561232057600192505050610b75565b8061232a81612a78565b9150506122a4565b505060195460ff169392505050565b60008061237361235d600a60185461243590919063ffffffff16565b611a6461236c6109a2886124b7565b8690612435565b306000908152600a6020526040902054909150612390908261180d565b306000818152600a6020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906123e19085815260200190565b60405180910390a36113c98382611779565b6000610c3683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061257b565b60008260000361244757506000610b75565b60006124538385612a91565b9050826124608583612855565b14610c365760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ac4565b600080601f80548060200260200160405190810160405280929190818152602001828054801561251057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116124f2575b5050505050905060005b8151811015612571578181815181106125355761253561289d565b60200260200101516001600160a01b0316846001600160a01b03160361255f575060019392505050565b8061256981612a78565b91505061251a565b5060009392505050565b6000818361259c5760405162461bcd60e51b8152600401610ac491906125cd565b5060006113c98486612855565b60005b838110156125c45781810151838201526020016125ac565b50506000910152565b60208152600082518060208401526125ec8160408501602087016125a9565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461261757600080fd5b919050565b6000806040838503121561262f57600080fd5b61263883612600565b946020939093013593505050565b60008060006060848603121561265b57600080fd5b61266484612600565b925061267260208501612600565b9150604084013590509250925092565b60006020828403121561269457600080fd5b610c3682612600565b6000602082840312156126af57600080fd5b5035919050565b8035801515811461261757600080fd5b600080604083850312156126d957600080fd5b6126e283612600565b91506126f0602084016126b6565b90509250929050565b6000806000806000806000806000806101408b8d03121561271957600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506101008b013591506127636101208c016126b6565b90509295989b9194979a5092959850565b6000806040838503121561278757600080fd5b61279083612600565b91506126f060208401612600565b600080604083850312156127b157600080fd5b612638836126b6565b600080600080608085870312156127d057600080fd5b5050823594602084013594506040840135936060013592509050565b6000602082840312156127fe57600080fd5b610c36826126b6565b6000806040838503121561281a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261287257634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610b7557610b7561283f565b80820180821115610b7557610b7561283f565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129035784516001600160a01b0316835293830193918301916001016128de565b50506001600160a01b03969096166060850152505050608001529392505050565b600060033d111561293d5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561297457634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156129895790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156129b957505050505090565b82850191508151818111156129d15750505050505090565b843d87010160208285010111156129eb5750505050505090565b6129fa60208286010187612940565b509095945050505050565b7f537761704261636b206661696c65642077697468206572726f72200000000000815260008251612a3d81601b8501602087016125a9565b91909101601b0192915050565b600080600060608486031215612a5f57600080fd5b8351925060208401519150604084015190509250925092565b600060018201612a8a57612a8a61283f565b5060010190565b8082028115828204841417610b7557610b7561283f56fe3e1799d428897e6f54bdb61036ad40e2aa67a45b0181c60fe2f15a9d33a084d6a2646970667358221220aa4416150c831addbf57c01c6179ba3d37cdb48ed3d9236ff1faea43951fec6864736f6c634300081400336080604052600180546001600160a01b0319908116738da17db850315a34532108f0f5458fc0401525f617909155600280548216732b591e99afe9f32eaa6214f7b7629768c40eeb391790556003805482167367d8954c2b7386c8dbf6936cc2355ba2227f0a8f17905560048054821673a1077a294dde1b09bb078844df40758a5d0f9a271790556005805490911690556ec097ce7bc90715b34b9f10000000006014819055610e10601581905567016345785d8a0000601655601c91909155601d556402540be400601e55348015620000d857600080fd5b5060405162001ec738038062001ec7833981016040819052620000fb9162000269565b6001600160a01b03831662000125577398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0262000127565b825b600680546001600160a01b0319166001600160a01b039283161790558216620001655773165c3410fc91ef562c50559f7d2289febed552d962000167565b815b600780546001600160a01b0319166001600160a01b039283161790558116620001a55773eb45a3c4aedd0f47f345fb4c8a1802bb5740d725620001a7565b805b600880546001600160a01b039283166001600160a01b031991821617909155600080549091163317905560035460405163095ea7b360e01b815291166004820181905260001960248301529063095ea7b3906044016020604051808303816000875af11580156200021c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002429190620002b3565b50505050620002de565b80516001600160a01b03811681146200026457600080fd5b919050565b6000806000606084860312156200027f57600080fd5b6200028a846200024c565b92506200029a602085016200024c565b9150620002aa604085016200024c565b90509250925092565b600060208284031215620002c657600080fd5b81518015158114620002d757600080fd5b9392505050565b611bd980620002ee6000396000f3fe6080604052600436106101d15760003560e01c806389ed7965116100f7578063ce7c2ac211610095578063df137cf611610064578063df137cf6146104c8578063e0bf82ec146104de578063ef7c3a39146104fe578063f0fc6bca1461050657600080fd5b8063ce7c2ac214610414578063d56916b014610486578063d9cb19df1461049c578063dd728075146104b257600080fd5b80639946b1d7116100d15780639946b1d7146103b2578063b1ae2ada146103d2578063c56b7fc1146103e8578063c702ee3f146103fe57600080fd5b806389ed79651461037457806389fa276d1461037c5780638d5396e91461039257600080fd5b80634bdeabe81161016f5780636bdb4f711161013e5780636bdb4f71146103085780636d2b49401461031e5780637a9a97d71461033e57806383b922181461035e57600080fd5b80634bdeabe8146102845780634f15999a146102a45780635cbe2777146102dc57806364ec8299146102f257600080fd5b80632b46c77a116101ab5780632b46c77a1461020f5780632d98b6d7146102385780633a98ef391461025857806342dc72a11461026e57600080fd5b806314b6ca96146101dd57806317515488146101ff5780631adb88b31461020757600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611966565b61051b565b005b6101fd6106d3565b6101fd610903565b34801561021b57600080fd5b5061022560135481565b6040519081526020015b60405180910390f35b34801561024457600080fd5b50610225610253366004611990565b610aeb565b34801561026457600080fd5b50610225600f5481565b34801561027a57600080fd5b50610225601c5481565b34801561029057600080fd5b506101fd61029f3660046119ab565b610b76565b3480156102b057600080fd5b506007546102c4906001600160a01b031681565b6040516001600160a01b03909116815260200161022f565b3480156102e857600080fd5b5061022560125481565b3480156102fe57600080fd5b5061022560155481565b34801561031457600080fd5b5061022560115481565b34801561032a57600080fd5b506008546102c4906001600160a01b031681565b34801561034a57600080fd5b50610225610359366004611990565b610c7a565b34801561036a57600080fd5b50610225601f5481565b6101fd610cf3565b34801561038857600080fd5b50610225601d5481565b34801561039e57600080fd5b506006546102c4906001600160a01b031681565b3480156103be57600080fd5b506101fd6103cd3660046119ab565b610f14565b3480156103de57600080fd5b5061022560175481565b3480156103f457600080fd5b50610225601b5481565b34801561040a57600080fd5b5061022560195481565b34801561042057600080fd5b5061045e61042f366004611990565b600e60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a00161022f565b34801561049257600080fd5b5061022560165481565b3480156104a857600080fd5b50610225601e5481565b3480156104be57600080fd5b5061022560145481565b3480156104d457600080fd5b50610225601a5481565b3480156104ea57600080fd5b506101fd6104f93660046119c4565b61100a565b6101fd611035565b34801561051257600080fd5b506101fd611255565b6000546001600160a01b0316331461053257600080fd5b6001600160a01b0382166000908152600e6020526040902054156105625761055982611269565b610562826113a4565b60008111801561058857506001600160a01b0382166000908152600e6020526040902054155b156105fb57600980546001600160a01b0384166000818152600a60209081526040808320859055600c9091528120839055600183018455929092527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916909117905561062e565b8015801561062057506001600160a01b0382166000908152600e602052604090205415155b1561062e5761062e826114be565b6001600160a01b0382166000908152600e6020526040902054600f5461065f918391610659916116b2565b906116fd565b600f556001600160a01b0382166000908152600e6020526040902081905561068681611761565b6001600160a01b0383166000908152600e602052604090206001810191909155546106b09061177e565b6001600160a01b039092166000908152600e602052604090206003019190915550565b6000546001600160a01b031633146106ea57600080fd5b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075791906119f6565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b03169183915060009061079d5761079d611a0f565b6001600160a01b03928316602091820292909201015260018054835192169183919081106107cd576107cd611a0f565b6001600160a01b039283166020918202929092010152600854604051637ff36ab560e01b8152911690637ff36ab590349061081390600090869030904290600401611a25565b6000604051808303818588803b15801561082c57600080fd5b505af1158015610840573d6000803e3d6000fd5b50506001546040516370a0823160e01b8152306004820152600094506108c193508692506001600160a01b03909116906370a08231906024015b602060405180830381865afa158015610897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bb91906119f6565b906116b2565b6011549091506108d190826116fd565b601155600f546014546108fb916108f2916108ec908561179b565b9061181d565b601354906116fd565b601355505050565b6000546001600160a01b0316331461091a57600080fd5b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610963573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098791906119f6565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b0316918391506000906109cd576109cd611a0f565b6001600160a01b0392831660209182029290920101526002548251911690829060019081106109fe576109fe611a0f565b6001600160a01b039283166020918202929092010152600654604051637ff36ab560e01b8152911690637ff36ab5903490610a4490600090869030904290600401611a25565b6000604051808303818588803b158015610a5d57600080fd5b505af1158015610a71573d6000803e3d6000fd5b50506002546040516370a0823160e01b815230600482015260009450610aaf93508692506001600160a01b03909116906370a082319060240161087a565b601954909150610abf90826116fd565b601955600f54601c54610ae391610ada916108ec908561179b565b601b54906116fd565b601b55505050565b6001600160a01b0381166000908152600e60205260408120548103610b1257506000919050565b6001600160a01b0382166000908152600e6020526040812054610b3490611761565b6001600160a01b0384166000908152600e6020526040902060010154909150808211610b64575060009392505050565b610b6e82826116b2565b949350505050565b6000546001600160a01b03163314610b8d57600080fd5b6009546000819003610b9d575050565b6000805a905060005b8483108015610bb457508381105b15610c73578360185410610bc85760006018555b610bfa600960185481548110610be057610be0611a0f565b6000918252602090912001546001600160a01b031661185f565b15610c3157610c31600960185481548110610c1757610c17611a0f565b6000918252602090912001546001600160a01b03166113a4565b610c46610c3f5a84906116b2565b84906116fd565b92505a601880549193506000610c5b83611aa5565b91905055508080610c6b90611aa5565b915050610ba6565b5050505050565b6001600160a01b0381166000908152600e60205260408120548103610ca157506000919050565b6001600160a01b0382166000908152600e6020526040812054610cc39061177e565b6001600160a01b0384166000908152600e6020526040902060030154909150808211610b64575060009392505050565b6000546001600160a01b03163314610d0a57600080fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7791906119f6565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b031691839150600090610dbd57610dbd611a0f565b6001600160a01b039283166020918202929092010152600354825191169082906001908110610dee57610dee611a0f565b6001600160a01b039283166020918202929092010152600854604051637ff36ab560e01b8152911690637ff36ab5903490610e3490600090869030904290600401611a25565b6000604051808303818588803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b50506003546040516370a0823160e01b815230600482015260009450610e9f93508692506001600160a01b03909116906370a082319060240161087a565b600354604051630852cd8d60e31b8152600481018390529192506001600160a01b0316906342966c6890602401600060405180830381600087803b158015610ee657600080fd5b505af1158015610efa573d6000803e3d6000fd5b5050601f54610f0c92509050826116fd565b601f55505050565b6000546001600160a01b03163314610f2b57600080fd5b6009546000819003610f3b575050565b6000805a905060005b8483108015610f5257508381105b15610c73578360105410610f665760006010555b610f98600960105481548110610f7e57610f7e611a0f565b6000918252602090912001546001600160a01b03166118a4565b15610fcf57610fcf600960105481548110610fb557610fb5611a0f565b6000918252602090912001546001600160a01b0316611269565b610fdd610c3f5a84906116b2565b92505a601080549193506000610ff283611aa5565b9190505550808061100290611aa5565b915050610f44565b6000546001600160a01b0316331461102157600080fd5b601593909355601691909155601d55601e55565b6000546001600160a01b0316331461104c57600080fd5b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b991906119f6565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b0316918391506000906110ff576110ff611a0f565b6001600160a01b039283166020918202929092010152600180548351921691839190811061112f5761112f611a0f565b6001600160a01b039283166020918202929092010152600854604051637ff36ab560e01b8152911690637ff36ab590349061117590600090869030904290600401611a25565b6000604051808303818588803b15801561118e57600080fd5b505af11580156111a2573d6000803e3d6000fd5b50506001546040516370a0823160e01b8152306004820152600094506111e093508692506001600160a01b03909116906370a082319060240161087a565b600154604051630852cd8d60e31b8152600481018390529192506001600160a01b0316906342966c6890602401600060405180830381600087803b15801561122757600080fd5b505af115801561123b573d6000803e3d6000fd5b505060175461124d92509050826116fd565b601755505050565b61125e33611269565b611267336113a4565b565b6001600160a01b0381166000908152600e6020526040812054900361128b5750565b600061129682610aeb565b905080156113a0576012546112ab90826116fd565b60125560015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af1158015611301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113259190611abe565b506001600160a01b0382166000908152600b60209081526040808320429055600e90915290206002015461135990826116fd565b6001600160a01b0383166000908152600e6020526040902060028101919091555461138390611761565b6001600160a01b0383166000908152600e60205260409020600101555b5050565b6001600160a01b0381166000908152600e602052604081205490036113c65750565b60006113d182610c7a565b905080156113a057601a546113e690826116fd565b601a5560025460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af115801561143c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114609190611abe565b506001600160a01b0382166000908152600d60209081526040808320429055600e90915290206004015461149490826116fd565b6001600160a01b0383166000908152600e602052604090206004810191909155546106b09061177e565b600980546114ce90600190611ae0565b815481106114de576114de611a0f565b60009182526020808320909101546001600160a01b038481168452600a90925260409092205460098054929093169291811061151c5761151c611a0f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600a918290526040812054600980549193929161156890600190611ae0565b8154811061157857611578611a0f565b60009182526020808320909101546001600160a01b03168352820192909252604001902055600980546115ad90600190611ae0565b815481106115bd576115bd611a0f565b60009182526020808320909101546001600160a01b038481168452600c9092526040909220546009805492909316929181106115fb576115fb611a0f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600c918290526040812054600980549193929161164790600190611ae0565b8154811061165757611657611a0f565b60009182526020808320909101546001600160a01b03168352820192909252604001902055600980548061168d5761168d611af3565b600082815260209020810160001990810180546001600160a01b031916905501905550565b60006116f483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118e2565b90505b92915050565b60008061170a8385611b09565b9050838110156116f45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b60006116f76014546108ec6013548561179b90919063ffffffff16565b60006116f7601c546108ec601b548561179b90919063ffffffff16565b6000826000036117ad575060006116f7565b60006117b98385611b1c565b9050826117c68583611b33565b146116f45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611758565b60006116f483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061191c565b601d546001600160a01b0382166000908152600d6020526040812054909142916118899190611b09565b1080156116f75750601e5461189d83610c7a565b1192915050565b6015546001600160a01b0382166000908152600b6020526040812054909142916118ce9190611b09565b1080156116f7575060165461189d83610aeb565b600081848411156119065760405162461bcd60e51b81526004016117589190611b55565b5060006119138486611ae0565b95945050505050565b6000818361193d5760405162461bcd60e51b81526004016117589190611b55565b5060006119138486611b33565b80356001600160a01b038116811461196157600080fd5b919050565b6000806040838503121561197957600080fd5b6119828361194a565b946020939093013593505050565b6000602082840312156119a257600080fd5b6116f48261194a565b6000602082840312156119bd57600080fd5b5035919050565b600080600080608085870312156119da57600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215611a0857600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611a6f5784516001600160a01b031683529383019391830191600101611a4a565b50506001600160a01b039690961660408501525050506060015292915050565b634e487b7160e01b600052601160045260246000fd5b600060018201611ab757611ab7611a8f565b5060010190565b600060208284031215611ad057600080fd5b815180151581146116f457600080fd5b818103818111156116f7576116f7611a8f565b634e487b7160e01b600052603160045260246000fd5b808201808211156116f7576116f7611a8f565b80820281158282048414176116f7576116f7611a8f565b600082611b5057634e487b7160e01b600052601260045260246000fd5b500490565b600060208083528351808285015260005b81811015611b8257858101830151858201604001528201611b66565b506000604082860101526040601f19601f830116850101925050509291505056fea2646970667358221220da1d35693de099a1954551805d8cc5e1d1453753183a1d380cdb7600972d245e64736f6c6343000814003300000000000000000000000098bf93ebf5c380c0e6ae8e192a7e2ae08edacc02000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9000000000000000000000000eb45a3c4aedd0f47f345fb4c8a1802bb5740d725

Deployed ByteCode

0x6080604052600436106103535760003560e01c806379f7c50a116101c6578063c2b7bbb6116100f7578063e0df99e811610095578063f2fde38b1161006f578063f2fde38b146109a7578063f708a64f146109c7578063f84ba65d146109e7578063fc06a95914610a0757600080fd5b8063e0df99e81461095c578063f0fc6bca14610972578063f1f3bca31461098757600080fd5b8063d22b98a1116100d1578063d22b98a1146108c0578063dd62ed3e146108d6578063df20fd491461091c578063e0bf82ec1461093c57600080fd5b8063c2b7bbb61461085b578063ca33e64c1461087b578063cbaad20a146108a057600080fd5b806398118cb411610164578063b91ac7881161013e578063b91ac788146107ef578063bf56b3711461080f578063bfc485c514610825578063bfe109281461083b57600080fd5b806398118cb4146107a35780639d9241ec146107b9578063a9059cbb146107cf57600080fd5b80638d5396e9116101a05780638d5396e9146107235780638da5cb5b146107435780638e9b4c671461076157806395d89b411461077757600080fd5b806379f7c50a146106c75780637d1db4a5146106dd5780638b42507f146106f357600080fd5b80633f4218e0116102a05780635c85974f1161023e5780636ddd1713116102185780636ddd17131461064257806370a082311461065c578063715018a61461069257806379c36d9f146106a757600080fd5b80635c85974f146105e2578063658d4b7f146106025780636d2b49401461062257600080fd5b80634f15999a1161027a5780634f15999a1461057c57806358c6eb2e1461059c57806359b107b9146105b25780635abe6711146105c857600080fd5b80633f4218e0146105065780634355855a146105365780634ce027fe1461056657600080fd5b80631865009d1161030d5780632b112e49116102e75780632b112e491461049f5780632f6ec43a146104b4578063313ce567146104ca5780633190bb8a146104e657600080fd5b80631865009d1461043157806323b872dd1461044757806326041bf61461046757600080fd5b806293dc141461035f57806301339c21146103765780630445b6671461038b57806306fdde03146103b4578063095ea7b3146103ec57806318160ddd1461041c57600080fd5b3661035a57005b600080fd5b34801561036b57600080fd5b50610374610a27565b005b34801561038257600080fd5b50610374610a7c565b34801561039757600080fd5b506103a160255481565b6040519081526020015b60405180910390f35b3480156103c057600080fd5b5060408051808201909152600681526547656c61746f60d01b60208201525b6040516103ab91906125cd565b3480156103f857600080fd5b5061040c61040736600461261c565b610b0e565b60405190151581526020016103ab565b34801561042857600080fd5b506008546103a1565b34801561043d57600080fd5b506103a160275481565b34801561045357600080fd5b5061040c610462366004612646565b610b7b565b34801561047357600080fd5b50601a54610487906001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b3480156104ab57600080fd5b506103a1610c3d565b3480156104c057600080fd5b506103a160285481565b3480156104d657600080fd5b50604051601281526020016103ab565b3480156104f257600080fd5b50610374610501366004612682565b610c8f565b34801561051257600080fd5b5061040c610521366004612682565b600c6020526000908152604090205460ff1681565b34801561054257600080fd5b5061040c610551366004612682565b600e6020526000908152604090205460ff1681565b34801561057257600080fd5b506103a160115481565b34801561058857600080fd5b50601c54610487906001600160a01b031681565b3480156105a857600080fd5b506103a160105481565b3480156105be57600080fd5b506103a160165481565b3480156105d457600080fd5b5060195461040c9060ff1681565b3480156105ee57600080fd5b506103746105fd36600461269d565b610cd1565b34801561060e57600080fd5b5061037461061d3660046126c6565b610cfa565b34801561062e57600080fd5b50601d54610487906001600160a01b031681565b34801561064e57600080fd5b5060245461040c9060ff1681565b34801561066857600080fd5b506103a1610677366004612682565b6001600160a01b03166000908152600a602052604090205490565b34801561069e57600080fd5b50610374610d2d565b3480156106b357600080fd5b506103746106c23660046126f9565b610d41565b3480156106d357600080fd5b506103a160295481565b3480156106e957600080fd5b506103a160095481565b3480156106ff57600080fd5b5061040c61070e366004612682565b600d6020526000908152604090205460ff1681565b34801561072f57600080fd5b50601b54610487906001600160a01b031681565b34801561074f57600080fd5b506001546001600160a01b0316610487565b34801561076d57600080fd5b506103a1600f5481565b34801561078357600080fd5b5060408051808201909152600381526211d15360ea1b60208201526103df565b3480156107af57600080fd5b506103a160155481565b3480156107c557600080fd5b506103a160175481565b3480156107db57600080fd5b5061040c6107ea36600461261c565b610f16565b3480156107fb57600080fd5b5061048761080a36600461269d565b610f23565b34801561081b57600080fd5b506103a160205481565b34801561083157600080fd5b506103a160145481565b34801561084757600080fd5b50602154610487906001600160a01b031681565b34801561086757600080fd5b50610374610876366004612682565b610f4d565b34801561088757600080fd5b506019546104879061010090046001600160a01b031681565b3480156108ac57600080fd5b506103746108bb366004612682565b610fb7565b3480156108cc57600080fd5b506103a160135481565b3480156108e257600080fd5b506103a16108f1366004612774565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b34801561092857600080fd5b5061037461093736600461279e565b610ff4565b34801561094857600080fd5b506103746109573660046127ba565b61102a565b34801561096857600080fd5b506103a160125481565b34801561097e57600080fd5b506103746110c2565b34801561099357600080fd5b506103a16109a23660046127ec565b61112c565b3480156109b357600080fd5b506103746109c2366004612682565b61115b565b3480156109d357600080fd5b506103746109e23660046126c6565b611199565b3480156109f357600080fd5b50610374610a023660046126c6565b6112b2565b348015610a1357600080fd5b50610374610a22366004612807565b6112e5565b610a2f61136b565b601f805480610a4057610a40612829565b600082815260208120820160001990810180546001600160a01b0319169055909101909155604051600080516020612aa98339815191529190a1565b610a8461136b565b60205415610acd5760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c903630bab731b432b21760791b60448201526064015b60405180910390fd5b42602081815560408051438152918201929092527f87dcd6626ffde0faf682a10e7b64aff36ea73a5470d5fa6cc7ebd372e4b19001910160405180910390a1565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b699086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383166000908152600b6020908152604080832033845290915281205460001914610c28576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600b82528381203382529091529190912054610c03918490611398565b6001600160a01b0385166000908152600b602090815260408083203384529091529020555b610c338484846113d2565b90505b9392505050565b6007546001600160a01b03166000908152600a6020526040812054610c8a906006546001600160a01b03166000908152600a6020526040902054610c849060085490611779565b90611779565b905090565b610c9761136b565b60198054610100600160a81b0319166101006001600160a01b03841602179055604051600080516020612aa983398151915290600090a150565b610cd961136b565b6107d0600854610ce99190612855565b811015610cf557600080fd5b600955565b610d0261136b565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b610d3561136b565b610d3f60006117bb565b565b610d4961136b565b600f8a9055601089905560118890556012879055601386905560148590556015849055601683905560178290556101f4871115610db95760405162461bcd60e51b815260206004820152600e60248201526d1a903832b931b2b73a1036b0bc1760911b6044820152606401610ac4565b601854610df7601554610df1601454610df1601354610df1601254610df1601154610df1601054600f5461180d90919063ffffffff16565b9061180d565b1115610e6b5760405162461bcd60e51b815260206004820152603d60248201527f54686520746f74616c206f6620616c6c20636f6d62696e65642066656573206d60448201527f75737420626520313030303020666f72203130302070657263656e742e0000006064820152608401610ac4565b6018546016541115610eb25760405162461bcd60e51b815260206004820152601060248201526f084eaf240cccaca40e8dede40d0d2ced60831b6044820152606401610ac4565b6018546017541115610efa5760405162461bcd60e51b81526020600482015260116024820152700a6cad8d840cccaca40e8dede40d0d2ced607b1b6044820152606401610ac4565b6019805460ff1916911515919091179055505050505050505050565b6000610c363384846113d2565b601f8181548110610f3357600080fd5b6000918252602090912001546001600160a01b0316905081565b610f5561136b565b601f805460018101825560009182527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180546001600160a01b0319166001600160a01b038416179055604051600080516020612aa98339815191529190a150565b610fbf61136b565b601a80546001600160a01b0319166001600160a01b038316179055604051600080516020612aa983398151915290600090a150565b610ffc61136b565b6024805460ff19168315151790556025819055604051600080516020612aa983398151915290600090a15050565b61103261136b565b60215460405163382fe0bb60e21b8152600481018690526024810185905260448101849052606481018390526001600160a01b039091169063e0bf82ec90608401600060405180830381600087803b15801561108d57600080fd5b505af11580156110a1573d6000803e3d6000fd5b5050604051600080516020612aa9833981519152925060009150a150505050565b602160009054906101000a90046001600160a01b03166001600160a01b031663f0fc6bca6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b50505050565b600060205460000361114657601854610b75906001611779565b8161115357601654610b75565b505060175490565b61116361136b565b6001600160a01b03811661118d57604051631e4fbdf760e01b815260006004820152602401610ac4565b611196816117bb565b50565b6111a161136b565b6001600160a01b03821630148015906111c85750601e546001600160a01b03838116911614155b6111d157600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff1916821580159190911790915561126957602154604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b15801561124d57600080fd5b505af1158015611261573d6000803e3d6000fd5b505050505050565b6021546001600160a01b038381166000818152600a602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401611233565b6112ba61136b565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6112ed61136b565b60228290556023819055620f4240821180159061130f5750620f424060235411155b6113505760405162461bcd60e51b815260206004820152601260248201527104d61782067617320697320313030303030360741b6044820152606401610ac4565b604051600080516020612aa983398151915290600090a15050565b6001546001600160a01b03163314610d3f5760405163118cdaa760e01b8152336004820152602401610ac4565b600081848411156113bc5760405162461bcd60e51b8152600401610ac491906125cd565b5060006113c98486612877565b95945050505050565b60008060205411806113ee57506001546001600160a01b031632145b61143a5760405162461bcd60e51b815260206004820181905260248201527f54686520636f6e7472616374206973206e6f74206c61756e63686564207965746044820152606401610ac4565b60265460ff16156114575761145084848461186c565b9050610c36565b611462848484611952565b61146a6119e3565b1561147757611477611a32565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387166000908152600a90915291909120546114c9918490611398565b6001600160a01b0385166000908152600a60205260408120919091556114ef85856121eb565b6114f95782611504565b611504858585612341565b6001600160a01b0385166000908152600a602052604090205490915061152a908261180d565b6001600160a01b038086166000908152600a60209081526040808320949094559188168152600e909152205460ff166115ce576021546001600160a01b038681166000818152600a602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b1580156115bb57600080fd5b505af19250505080156115cc575060015b505b6001600160a01b0384166000908152600e602052604090205460ff1661165f576021546001600160a01b038581166000818152600a602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561164c57600080fd5b505af192505050801561165d575060015b505b602154602254604051639946b1d760e01b81526001600160a01b0390921691639946b1d7916116949160040190815260200190565b600060405180830381600087803b1580156116ae57600080fd5b505af19250505080156116bf575060015b5060215460235460405163097bd57d60e31b81526001600160a01b0390921691634bdeabe8916116f59160040190815260200190565b600060405180830381600087803b15801561170f57600080fd5b505af1925050508015611720575060015b50836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161176691815260200190565b60405180910390a3506001949350505050565b6000610c3683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611398565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061181a838561288a565b905083811015610c365760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ac4565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600a909152918220546118bd918490611398565b6001600160a01b038086166000908152600a602052604080822093909355908516815220546118ec908361180d565b6001600160a01b038085166000818152600a602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906119409086815260200190565b60405180910390a35060019392505050565b6009548111158061197b57506001600160a01b0383166000908152600d602052604090205460ff165b8061199e57506001600160a01b0382166000908152600d602052604090205460ff165b6119de5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610ac4565b505050565b601e546000906001600160a01b03163314801590611a04575060265460ff16155b8015611a12575060245460ff165b8015610c8a575050602554306000908152600a6020526040902054101590565b6026805460ff19166001179055601854601554600091611a6a91611a6490611a5b9060026123f3565b60255490612435565b906123f3565b90506000611a8b601854611a6460115460255461243590919063ffffffff16565b90506000611aac601854611a6460125460255461243590919063ffffffff16565b90508115611ade57600754611acc9030906001600160a01b0316846113d2565b50602754611ada908361180d565b6027555b8015611afe57601a54611afc9030906001600160a01b0316836113d2565b505b6000611b1d82610c8485610c848860255461177990919063ffffffff16565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110611b5757611b5761289d565b6001600160a01b039283166020918202929092010152600254825191169082906001908110611b8857611b8861289d565b6001600160a01b039283166020918202929092010152601c5460405163791ac94760e01b815291169063791ac94790611bce9086906000908690309042906004016128b3565b600060405180830381600087803b158015611be857600080fd5b505af1925050508015611bf9575060015b611d0957611c05612924565b806308c379a003611c7e5750611c1961297b565b80611c245750611c80565b7fc41a20ad8c23d3903584975786330c6ec73ccfcc657629f10237b792268b0e0281604051602001611c569190612a05565b60408051601f1981840301815290829052611c70916125cd565b60405180910390a1506121d9565b505b7fc41a20ad8c23d3903584975786330c6ec73ccfcc657629f10237b792268b0e02604051611cfc9060208082526034908201527f537761704261636b206661696c656420776974686f757420616e206572726f72604082015273040dacae6e6c2ceca40cce4deda40a0ead8e6cab60631b606082015260800190565b60405180910390a16121d9565b6000611d154784611779565b90506000611d63611d4a601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b60185490611779565b601554611a6490611d5c9060026123f3565b8590612435565b90506000611d9d611d8f601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b600f54611a64908690612435565b90506000611dd7611dc9601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b601054611a64908790612435565b90506000611e11611e03601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b601354611a64908890612435565b90506000611e4b611e3d601254610c84601154610c84611d4160026015546123f390919063ffffffff16565b601454611a64908990612435565b90508b15611f8457601c5460195460405163f305d71960e01b8152306004820152602481018f905260006044820152606481018890526001600160a01b03610100909204821660848201524260a482015291169063f305d71990879060c40160606040518083038185885af193505050508015611ee5575060408051601f3d908101601f19168201909252611ee291810190612a4a565b60015b611f275760408051600080825260208201527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506910160405180910390a1611f84565b5050602854611f3791508661180d565b602855602954611f47908d61180d565b602955604080518d8152602081018790527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506910160405180910390a15b8315611fee57602160009054906101000a90046001600160a01b03166001600160a01b031663ef7c3a39856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611fda57600080fd5b505af193505050508015611fec575060015b505b821561205857602160009054906101000a90046001600160a01b03166001600160a01b03166389ed7965846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561204457600080fd5b505af193505050508015612056575060015b505b81156120c257602160009054906101000a90046001600160a01b03166001600160a01b03166317515488836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120ae57600080fd5b505af1935050505080156120c0575060015b505b801561212c57602160009054906101000a90046001600160a01b03166001600160a01b0316631adb88b3826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561211857600080fd5b505af19350505050801561212a575060015b505b471561219f5760006121466001546001600160a01b031690565b6001600160a01b03164761753090604051600060405180830381858888f193505050503d8060008114612195576040519150601f19603f3d011682016040523d82523d6000602084013e61219a565b606091505b505050505b6040518981527fb39214ef4f33ea2d9d329fb67a4f17e7588bf6e00ed15a7967137ba819697a279060200160405180910390a15050505050505b50506026805460ff1916905550505050565b6001600160a01b0382166000908152600c602052604081205460ff168061222a57506001600160a01b0382166000908152600c602052604090205460ff165b806122355750602054155b1561224257506000610b75565b6000601f80548060200260200160405190810160405280929190818152602001828054801561229a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161227c575b5050505050905060005b8151811015612332578181815181106122bf576122bf61289d565b60200260200101516001600160a01b0316856001600160a01b0316148061231057508181815181106122f3576122f361289d565b60200260200101516001600160a01b0316846001600160a01b0316145b1561232057600192505050610b75565b8061232a81612a78565b9150506122a4565b505060195460ff169392505050565b60008061237361235d600a60185461243590919063ffffffff16565b611a6461236c6109a2886124b7565b8690612435565b306000908152600a6020526040902054909150612390908261180d565b306000818152600a6020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906123e19085815260200190565b60405180910390a36113c98382611779565b6000610c3683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061257b565b60008260000361244757506000610b75565b60006124538385612a91565b9050826124608583612855565b14610c365760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ac4565b600080601f80548060200260200160405190810160405280929190818152602001828054801561251057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116124f2575b5050505050905060005b8151811015612571578181815181106125355761253561289d565b60200260200101516001600160a01b0316846001600160a01b03160361255f575060019392505050565b8061256981612a78565b91505061251a565b5060009392505050565b6000818361259c5760405162461bcd60e51b8152600401610ac491906125cd565b5060006113c98486612855565b60005b838110156125c45781810151838201526020016125ac565b50506000910152565b60208152600082518060208401526125ec8160408501602087016125a9565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461261757600080fd5b919050565b6000806040838503121561262f57600080fd5b61263883612600565b946020939093013593505050565b60008060006060848603121561265b57600080fd5b61266484612600565b925061267260208501612600565b9150604084013590509250925092565b60006020828403121561269457600080fd5b610c3682612600565b6000602082840312156126af57600080fd5b5035919050565b8035801515811461261757600080fd5b600080604083850312156126d957600080fd5b6126e283612600565b91506126f0602084016126b6565b90509250929050565b6000806000806000806000806000806101408b8d03121561271957600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013592506101008b013591506127636101208c016126b6565b90509295989b9194979a5092959850565b6000806040838503121561278757600080fd5b61279083612600565b91506126f060208401612600565b600080604083850312156127b157600080fd5b612638836126b6565b600080600080608085870312156127d057600080fd5b5050823594602084013594506040840135936060013592509050565b6000602082840312156127fe57600080fd5b610c36826126b6565b6000806040838503121561281a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261287257634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610b7557610b7561283f565b80820180821115610b7557610b7561283f565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129035784516001600160a01b0316835293830193918301916001016128de565b50506001600160a01b03969096166060850152505050608001529392505050565b600060033d111561293d5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561297457634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156129895790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156129b957505050505090565b82850191508151818111156129d15750505050505090565b843d87010160208285010111156129eb5750505050505090565b6129fa60208286010187612940565b509095945050505050565b7f537761704261636b206661696c65642077697468206572726f72200000000000815260008251612a3d81601b8501602087016125a9565b91909101601b0192915050565b600080600060608486031215612a5f57600080fd5b8351925060208401519150604084015190509250925092565b600060018201612a8a57612a8a61283f565b5060010190565b8082028115828204841417610b7557610b7561283f56fe3e1799d428897e6f54bdb61036ad40e2aa67a45b0181c60fe2f15a9d33a084d6a2646970667358221220aa4416150c831addbf57c01c6179ba3d37cdb48ed3d9236ff1faea43951fec6864736f6c63430008140033