ETH Price: $2,274.83 (-0.74%)

Token

BlastMoon (BMOON)
 

Overview

Max Total Supply

100,000,000 BMOON

Holders

1,114

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BlastMoon

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 20000 runs

Other Settings:
paris EvmVersion
File 1 of 12 : BlastMoon.sol
//SPDX-License-Identifier: MIT

/**

.BLASTMOON
.WEB: BLASTMOON.IO
.TG: @BLASTMOONIO
.X: @BLASTMOONIO
.MEDIUM: @BLASTMOONIO

      .--.   |V|
     /    \ _| /
     q .. p \ /
      \--/  //
     __||__//
    /.    _/
   // \  /
  //   ||
  \\  /  \
   )\|    |
  / || || |
  |/\| || |
     | || |
     \ || /
   __/ || \__
  \____/\____/

*/


pragma solidity ^0.8.18;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol";
import {IDEXFactory} from "./IDEXFactory.sol";
import {IDEXRouter} from "./IDEXRouter.sol";
import {IBlast} from "./IBlast.sol";

contract BlastMoon is IERC20, Ownable {
    using SafeMath for uint256;
    IBlast private constant BLAST = IBlast(0x4300000000000000000000000000000000000002);

    address private constant ROUTER = 0x98994a9A7a2570367554589189dC9772241650f6; 
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;

    string private constant _name = "BlastMoon";
    string private constant _symbol = "BMOON";
    uint8 private constant _decimals = 18;

    uint256 private constant _totalSupply = 10 * 10 ** 7 * 10 ** _decimals;  

    /* rOwned = ratio of tokens owned relative to circulating supply (NOT total supply, since circulating <= total) */
    mapping(address => uint256) public _rOwned;
    uint256 public _totalProportion = _totalSupply;

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

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

    uint256 public teamFeeBuy = 0;  
    uint256 public marketingFeeBuy = 100;  
    uint256 public reflectionFeeBuy = 200; 

    uint256 public teamFeeSell = 100; 
    uint256 public marketingFeeSell = 200; 
    uint256 public reflectionFeeSell = 200; 

    uint256 private constant feeDenominator = 10000;

    uint256 public totalFeeBuy = marketingFeeBuy + teamFeeBuy + reflectionFeeBuy;
    uint256 public totalFeeSell = marketingFeeSell + teamFeeSell + reflectionFeeSell;

    address public marketingFeeReceiver;
    address public teamFeeReceiver;

    IDEXRouter public router;
    address public pair;

    address public feeExemptSetter;
    address public blastOperator;

    bool public tradingOpen = false;

    bool public claimingFees = true;
    bool private alternateSwaps = true;
    uint256 private smallSwapThreshold = (_totalSupply * 2) / 1000;
    uint256 private largeSwapThreshold = (_totalSupply * 3) / 1000;

    uint256 public swapThreshold = smallSwapThreshold;
    bool private inSwap;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier onlyFeeExemptSetter() {
        require(msg.sender == feeExemptSetter, "Not fee exempt setter");
        _;
    }

    modifier onlyBlastOperator() {
        require(msg.sender == blastOperator, "Not blast operator");
        _;
    }

    constructor() {
        BLAST.configureClaimableGas();

        router = IDEXRouter(ROUTER);
        pair = IDEXFactory(router.factory()).createPair(
            address(this),
            router.WETH()
        );
        _allowances[address(this)][address(router)] = type(uint256).max;
        _allowances[address(this)][msg.sender] = type(uint256).max;

        isTxLimitExempt[address(this)] = true;
        isTxLimitExempt[address(router)] = true;
        isTxLimitExempt[pair] = true;
        isTxLimitExempt[msg.sender] = true;
        isFeeExempt[msg.sender] = true;
        teamFeeReceiver = msg.sender;
        feeExemptSetter = msg.sender;
        blastOperator = msg.sender;
        marketingFeeReceiver = 0xBabe6a2490A81c549CBe7aAfF2c1F2CC3cf9CA69;  

        _rOwned[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

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

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

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

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

    function getOwner() external view returns (address) {
        return owner();
    }

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

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

    function viewFeesBuy()
        external
        view
        returns (uint256, uint256, uint256, uint256, uint256)
    {
        return (
            marketingFeeBuy,
            teamFeeBuy,
            reflectionFeeBuy,
            totalFeeBuy,
            feeDenominator
        );
    }

    function viewFeesSell()
        external
        view
        returns (uint256, uint256, uint256, uint256, uint256)
    {
        return (
            marketingFeeSell,
            teamFeeSell,
            reflectionFeeSell,
            totalFeeSell,
            feeDenominator
        );
    }

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

    function approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }

    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] != type(uint256).max) {
            _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) {
        if (inSwap) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (
            recipient != pair &&
            recipient != DEAD &&
            !isTxLimitExempt[recipient]
        ) {
            require(tradingOpen, "Trading not open yet");
        }

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

        uint256 proportionAmount = tokensToProportion(amount);

        _rOwned[sender] = _rOwned[sender].sub(
            proportionAmount,
            "Insufficient Balance"
        );

        uint256 proportionReceived = shouldTakeFee(sender, recipient)
            ? takeFeeInProportions(
                sender == pair ? true : false,
                sender,
                recipient,
                proportionAmount
            )
            : proportionAmount;
        _rOwned[recipient] = _rOwned[recipient].add(proportionReceived);

        emit Transfer(
            sender,
            recipient,
            tokenFromReflection(proportionReceived)
        );
        return true;
    }

    function tokensToProportion(uint256 tokens) public view returns (uint256) {
        return tokens.mul(_totalProportion).div(_totalSupply);
    }

    function tokenFromReflection(
        uint256 proportion
    ) public view returns (uint256) {
        return proportion.mul(_totalSupply).div(_totalProportion);
    }

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

    function shouldTakeFee(
        address sender,
        address recipient
    ) internal view returns (bool) {
        return !isFeeExempt[sender] && !isFeeExempt[recipient];
    }

    function getTotalFeeBuy(bool) public view returns (uint256) {
        return totalFeeBuy;
    }

    function getTotalFeeSell(bool) public view returns (uint256) {
        return totalFeeSell;
    }

    function takeFeeInProportions(
        bool buying,
        address sender,
        address receiver,
        uint256 proportionAmount
    ) internal returns (uint256) {
        uint256 proportionFeeAmount = buying == true
            ? proportionAmount.mul(getTotalFeeBuy(receiver == pair)).div(
                feeDenominator
            )
            : proportionAmount.mul(getTotalFeeSell(receiver == pair)).div(
                feeDenominator
            );

        // reflect
        uint256 proportionReflected = buying == true
            ? proportionFeeAmount.mul(reflectionFeeBuy).div(totalFeeBuy)
            : proportionFeeAmount.mul(reflectionFeeSell).div(totalFeeSell);

        _totalProportion = _totalProportion.sub(proportionReflected);

        // take fees
        uint256 _proportionToContract = proportionFeeAmount.sub(
            proportionReflected
        );
        if (_proportionToContract > 0) {
            _rOwned[address(this)] = _rOwned[address(this)].add(
                _proportionToContract
            );

            emit Transfer(
                sender,
                address(this),
                tokenFromReflection(_proportionToContract)
            );
        }
        emit Reflect(proportionReflected, _totalProportion);
        return proportionAmount.sub(proportionFeeAmount);
    }

    function clearStuckBalance() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance,
            gas: 30000
        }("");
        require(success);
    }

    function clearForeignToken(
        address tokenAddress,
        uint256 tokens
    ) public returns (bool) {
        require(isTxLimitExempt[msg.sender]);
        require(tokenAddress != address(this), "Not allowed");
        if (tokens == 0) {
            tokens = IERC20(tokenAddress).balanceOf(address(this));
        }
        return IERC20(tokenAddress).transfer(msg.sender, tokens);
    }

    function shouldSwapBack() internal view returns (bool) {
        return
            msg.sender != pair &&
            !inSwap &&
            claimingFees &&
            balanceOf(address(this)) >= swapThreshold;
    }

    function swapBack() internal swapping {
        uint256 _totalFee = totalFeeSell.sub(reflectionFeeSell);
        uint256 amountToSwap = swapThreshold;
        approve(address(router), amountToSwap);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance;

        uint256 totalETHFee = _totalFee;
        uint256 amountETHMarketing = amountETH.mul(marketingFeeSell).div(
            totalETHFee
        );
        uint256 amountETHteam = amountETH.mul(teamFeeSell).div(totalETHFee);

        (bool tmpSuccess, ) = payable(marketingFeeReceiver).call{
            value: amountETHMarketing,
            gas: 30000
        }("");
        (tmpSuccess, ) = payable(teamFeeReceiver).call{
            value: amountETHteam,
            gas: 30000
        }("");

        swapThreshold = !alternateSwaps
            ? swapThreshold
            : swapThreshold == smallSwapThreshold
            ? largeSwapThreshold
            : smallSwapThreshold;
    }

    function setSwapBackSettings(
        bool _enabled,
        uint256 _amountS,
        uint256 _amountL,
        bool _alternate
    ) external onlyOwner {
        alternateSwaps = _alternate;
        claimingFees = _enabled;
        smallSwapThreshold = _amountS;
        largeSwapThreshold = _amountL;
        swapThreshold = smallSwapThreshold;
    }

    function enableTrading() public onlyOwner {
        tradingOpen = true;
    }

    function changeFees(
        uint256 _reflectionFeeBuy,
        uint256 _marketingFeeBuy,
        uint256 _teamFeeBuy,
        uint256 _reflectionFeeSell,
        uint256 _marketingFeeSell,
        uint256 _teamFeeSell
    ) external onlyOwner {
        reflectionFeeBuy = _reflectionFeeBuy;
        marketingFeeBuy = _marketingFeeBuy;
        teamFeeBuy = _teamFeeBuy;
        totalFeeBuy = reflectionFeeBuy.add(marketingFeeBuy).add(teamFeeBuy);

        reflectionFeeSell = _reflectionFeeSell;
        marketingFeeSell = _marketingFeeSell;
        teamFeeSell = _teamFeeSell;
        totalFeeSell = reflectionFeeSell.add(marketingFeeSell).add(teamFeeSell);

        require(totalFeeBuy <= 1000, "Cannot set buy fees above 10%"); // max fee possible
        require(totalFeeSell <= 1000, "Cannot set sell fees above 10%"); // max fee possible
    }

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

    function changeFeeExemptSetter(
        address _feeExemptSetter
    ) external onlyFeeExemptSetter {
        feeExemptSetter = _feeExemptSetter;
    }

    function renounceFeeExemptSetter() external onlyFeeExemptSetter {
        feeExemptSetter = address(0);
    }

    function changeBlastOperator(
        address _blastOperator
    ) external onlyBlastOperator() {
        require(_blastOperator != address(0), "Invalid address");
        blastOperator = _blastOperator;
    }

    function claimAllGas(address recipient) external onlyBlastOperator() {
        BLAST.claimAllGas(address(this), recipient);
    }

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

    function setFeeReceivers(
        address _marketingFeeReceiver,
        address _teamFeeReceiver
    ) external onlyOwner {
        marketingFeeReceiver = _marketingFeeReceiver;
        teamFeeReceiver = _teamFeeReceiver;
    }

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

    event Reflect(uint256 amountReflected, uint256 newTotalProportion);
}

File 2 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.18;

import {Context} from "../utils/Context.sol";

/**
 * @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.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

File 3 of 12 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    bool private _paused;

    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 4 of 12 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev An operation with an ERC20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
    }
}

File 5 of 12 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 6 of 12 : IDEXFactory.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

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

File 7 of 12 : IDEXRouter.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

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

    function WETH() external pure returns (address);

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

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

File 8 of 12 : IBlast.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

interface IBlast {
  function configureClaimableGas() external;
  function claimAllGas(address contractAddress, address recipient) external returns (uint256);
}

contract BlastGClaim {
    IBlast public constant BLAST = IBlast(0x4300000000000000000000000000000000000002);
    address public immutable OWNER;

    constructor() {
        OWNER = msg.sender;
    }

    function claimAllGas(address recipient) external payable {
        require(msg.sender == OWNER, "Only owner");
        BLAST.claimAllGas(address(this), recipient);
    }

    function configureClaimableGas() external payable {
        require(msg.sender == OWNER, "Only owner");
        BLAST.configureClaimableGas();
    }
}

File 9 of 12 : Context.sol
// SPDX-License-Identifier: MIT
// 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 10 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

File 11 of 12 : IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * ==== Security Considerations
 *
 * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
 * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
 * considered as an intention to spend the allowance in any specific way. The second is that because permits have
 * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
 * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
 * generally recommended is:
 *
 * ```solidity
 * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
 *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
 *     doThing(..., value);
 * }
 *
 * function doThing(..., uint256 value) public {
 *     token.safeTransferFrom(msg.sender, address(this), value);
 *     ...
 * }
 * ```
 *
 * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
 * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
 * {SafeERC20-safeTransferFrom}).
 *
 * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
 * contracts should have entry points that don't rely on permit.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 12 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 20000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountReflected","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalProportion","type":"uint256"}],"name":"Reflect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_rOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalProportion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blastOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_blastOperator","type":"address"}],"name":"changeBlastOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeExemptSetter","type":"address"}],"name":"changeFeeExemptSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reflectionFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_teamFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_reflectionFeeSell","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeSell","type":"uint256"},{"internalType":"uint256","name":"_teamFeeSell","type":"uint256"}],"name":"changeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"claimAllGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimingFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"clearForeignToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeExemptSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"","type":"bool"}],"name":"getTotalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"","type":"bool"}],"name":"getTotalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceFeeExemptSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IDEXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingFeeReceiver","type":"address"},{"internalType":"address","name":"_teamFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amountS","type":"uint256"},{"internalType":"uint256","name":"_amountL","type":"uint256"},{"internalType":"bool","name":"_alternate","type":"bool"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"teamFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proportion","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"tokensToProportion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewFeesBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewFeesSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126012600a620005eb565b62000022906305f5e10062000603565b6002556000600655606460075560c8600855606460095560c8600a5560c8600b556008546006546007546200005891906200061d565b6200006491906200061d565b600c55600b54600954600a546200007c91906200061d565b6200008891906200061d565b600d556013805462ffffff60a01b191661010160a81b1790556103e8620000b26012600a620005eb565b620000c2906305f5e10062000603565b620000cf90600262000603565b620000db919062000633565b6014556103e8620000ef6012600a620005eb565b620000ff906305f5e10062000603565b6200010c90600362000603565b62000118919062000633565b6015556014546016553480156200012e57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3507343000000000000000000000000000000000000026001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620001c057600080fd5b505af1158015620001d5573d6000803e3d6000fd5b5050601080546001600160a01b0319167398994a9a7a2570367554589189dc9772241650f69081179091556040805163c45a015560e01b8152905191935063c45a015592506004808201926020929091908290030181865afa15801562000240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000266919062000656565b6001600160a01b031663c9c6539630601060009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ef919062000656565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200033d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000363919062000656565b601180546001600160a01b039283166001600160a01b0319918216178255306000818152600360209081526040808320601080548916855281845282852060001990819055338087529285528386205594845260058352818420805460ff19908116600190811790925595548916855282852080548716821790559654909716835280832080548516871790558683528083208054851687179055600490915290208054909116909217909155600f805482168317905560128054821683178155601380548316909317909255600e805490911673babe6a2490a81c549cbe7aaff2c1f2cc3cf9ca691790556200045c90600a620005eb565b6200046c906305f5e10062000603565b33600081815260016020526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620004af6012600a620005eb565b620004bf906305f5e10062000603565b60405190815260200160405180910390a362000681565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200052d578160001904821115620005115762000511620004d6565b808516156200051f57918102915b93841c9390800290620004f1565b509250929050565b6000826200054657506001620005e5565b816200055557506000620005e5565b81600181146200056e5760028114620005795762000599565b6001915050620005e5565b60ff8411156200058d576200058d620004d6565b50506001821b620005e5565b5060208310610133831016604e8410600b8410161715620005be575081810a620005e5565b620005ca8383620004ec565b8060001904821115620005e157620005e1620004d6565b0290505b92915050565b6000620005fc60ff84168362000535565b9392505050565b8082028115828204841417620005e557620005e5620004d6565b80820180821115620005e557620005e5620004d6565b6000826200065157634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200066957600080fd5b81516001600160a01b0381168114620005fc57600080fd5b612cc780620006916000396000f3fe6080604052600436106103595760003560e01c8063715018a6116101bb578063b0f7ec38116100f7578063eae436d511610095578063f84ba65d1161006f578063f84ba65d14610a6d578063f887ea4014610a8d578063fb5f27fb14610aba578063ffb54a9914610ad057600080fd5b8063eae436d514610a0d578063f0a9e36514610a2d578063f2fde38b14610a4d57600080fd5b8063c458d314116100d1578063c458d31414610940578063cb29813c1461096d578063dd62ed3e1461098d578063e96fada2146109e057600080fd5b8063b0f7ec38146108d7578063b93bdb5f1461090a578063beb899e01461092b57600080fd5b80638b42507f11610164578063a4b45c001161013e578063a4b45c0014610854578063a8aa1b3114610874578063a9059cbb146108a1578063ac45ed1c146108c157600080fd5b80638b42507f146107de5780638da5cb5b1461079e57806395d89b411461080e57600080fd5b806384f6820a1161019557806384f6820a14610788578063893d20e81461079e5780638a8c523c146107c957600080fd5b8063715018a614610731578063832790fe1461074657806383a2bcea1461076857600080fd5b8063313ce567116102955780635314841611610233578063613f930f1161020d578063613f930f1461068c5780636308fb98146106d1578063658d4b7f146106f157806370a082311461071157600080fd5b80635314841614610629578063571ac8b01461063f5780635d4014601461065f57600080fd5b80633f4218e01161026f5780633f4218e01461057157806340291143146105a1578063409d0566146105f357806345ce53651461060957600080fd5b8063313ce5671461052a578063364333f4146105465780633b32f37c1461055b57600080fd5b80631780028711610302578063272b1323116102dc578063272b1323146104b15780632b112e49146104d35780632d44c931146104e85780632d8381191461050a57600080fd5b8063178002871461046657806318160ddd1461047c57806323b872dd1461049157600080fd5b80630cfc15f9116103335780630cfc15f91461040d57806310075a691461043a57806313374e7a1461045057600080fd5b80630445b6671461036557806306fdde031461038e578063095ea7b3146103dd57600080fd5b3661036057005b600080fd5b34801561037157600080fd5b5061037b60165481565b6040519081526020015b60405180910390f35b34801561039a57600080fd5b5060408051808201909152600981527f426c6173744d6f6f6e000000000000000000000000000000000000000000000060208201525b604051610385919061275b565b3480156103e957600080fd5b506103fd6103f83660046127ea565b610b02565b6040519015158152602001610385565b34801561041957600080fd5b5061037b610428366004612816565b60016020526000908152604090205481565b34801561044657600080fd5b5061037b60075481565b34801561045c57600080fd5b5061037b600a5481565b34801561047257600080fd5b5061037b60025481565b34801561048857600080fd5b5061037b610b7c565b34801561049d57600080fd5b506103fd6104ac366004612833565b610b9d565b3480156104bd57600080fd5b506104d16104cc366004612816565b610cab565b005b3480156104df57600080fd5b5061037b610ddf565b3480156104f457600080fd5b5061037b610503366004612882565b50600d5490565b34801561051657600080fd5b5061037b61052536600461289f565b610e1c565b34801561053657600080fd5b5060405160128152602001610385565b34801561055257600080fd5b506104d1610e50565b34801561056757600080fd5b5061037b60065481565b34801561057d57600080fd5b506103fd61058c366004612816565b60046020526000908152604090205460ff1681565b3480156105ad57600080fd5b50600f546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610385565b3480156105ff57600080fd5b5061037b60085481565b34801561061557600080fd5b5061037b61062436600461289f565b610f2e565b34801561063557600080fd5b5061037b600d5481565b34801561064b57600080fd5b506103fd61065a366004612816565b610f5b565b34801561066b57600080fd5b506013546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561069857600080fd5b50600754600654600854600c546127105b604080519586526020860194909452928401919091526060830152608082015260a001610385565b3480156106dd57600080fd5b506104d16106ec3660046128b8565b610f87565b3480156106fd57600080fd5b506104d161070c366004612902565b6110a4565b34801561071d57600080fd5b5061037b61072c366004612816565b61117b565b34801561073d57600080fd5b506104d16111aa565b34801561075257600080fd5b5061037b610761366004612882565b50600c5490565b34801561077457600080fd5b506104d1610783366004612816565b61129a565b34801561079457600080fd5b5061037b60095481565b3480156107aa57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166105ce565b3480156107d557600080fd5b506104d16113df565b3480156107ea57600080fd5b506103fd6107f9366004612816565b60056020526000908152604090205460ff1681565b34801561081a57600080fd5b5060408051808201909152600581527f424d4f4f4e00000000000000000000000000000000000000000000000000000060208201526103d0565b34801561086057600080fd5b506104d161086f36600461293b565b6114a1565b34801561088057600080fd5b506011546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108ad57600080fd5b506103fd6108bc3660046127ea565b611575565b3480156108cd57600080fd5b5061037b600b5481565b3480156108e357600080fd5b506013546103fd907501000000000000000000000000000000000000000000900460ff1681565b34801561091657600080fd5b50600a54600954600b54600d546127106106a9565b34801561093757600080fd5b506104d1611582565b34801561094c57600080fd5b506012546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561097957600080fd5b506104d1610988366004612969565b61162d565b34801561099957600080fd5b5061037b6109a836600461293b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b3480156109ec57600080fd5b50600e546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a1957600080fd5b506104d1610a28366004612816565b6117d8565b348015610a3957600080fd5b506103fd610a483660046127ea565b6118a0565b348015610a5957600080fd5b506104d1610a68366004612816565b611a6b565b348015610a7957600080fd5b506104d1610a88366004612902565b611c1c565b348015610a9957600080fd5b506010546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610ac657600080fd5b5061037b600c5481565b348015610adc57600080fd5b506013546103fd9074010000000000000000000000000000000000000000900460ff1681565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b6a9086815260200190565b60405180910390a35060015b92915050565b6000610b8a6012600a612afb565b610b98906305f5e100612b0a565b905090565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610c9657604080518082018252601681527f496e73756666696369656e7420416c6c6f77616e63650000000000000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600382528381203382529091529190912054610c64918490611cf3565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602090815260408083203384529091529020555b610ca1848484611d39565b90505b9392505050565b60135473ffffffffffffffffffffffffffffffffffffffff163314610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420626c617374206f70657261746f72000000000000000000000000000060448201526064015b60405180910390fd5b6040517f954fa5ee00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff821660248201527343000000000000000000000000000000000000029063954fa5ee906044016020604051808303816000875af1158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddb9190612b21565b5050565b6000610b98610dee600061117b565b610e16610dfc61dead61117b565b610e086012600a612afb565b610e16906305f5e100612b0a565b9061201d565b6000610b76600254610e4a6012600a610e359190612afb565b610e43906305f5e100612b0a565b8590612029565b90612035565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ed1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b604051600090339061753090479084818181858888f193505050503d8060008114610f18576040519150601f19603f3d011682016040523d82523d6000602084013e610f1d565b606091505b5050905080610f2b57600080fd5b50565b6000610b76610f3f6012600a612afb565b610f4d906305f5e100612b0a565b600254610e4a908590612029565b6000610b76827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610b02565b60005473ffffffffffffffffffffffffffffffffffffffff163314611008576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b601380549415157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff92151576010000000000000000000000000000000000000000000002929092167fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff90951694909417179092556014819055601591909155601655565b60125473ffffffffffffffffffffffffffffffffffffffff163314611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420666565206578656d70742073657474657200000000000000000000006044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812054610b7690610e1c565b60005473ffffffffffffffffffffffffffffffffffffffff16331461122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60135473ffffffffffffffffffffffffffffffffffffffff16331461131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420626c617374206f70657261746f7200000000000000000000000000006044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff8116611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c6964206164647265737300000000000000000000000000000000006044820152606401610d28565b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b601380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b600e805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600f8054929093169116179055565b6000610ca4338484611d39565b60125473ffffffffffffffffffffffffffffffffffffffff163314611603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420666565206578656d70742073657474657200000000000000000000006044820152606401610d28565b601280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b6008869055600785905560068490556116d1846116cb8888612041565b90612041565b600c55600b839055600a82905560098190556116f1816116cb8585612041565b600d55600c546103e81015611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f43616e6e6f74207365742062757920666565732061626f7665203130250000006044820152606401610d28565b6103e8600d5411156117d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f43616e6e6f74207365742073656c6c20666565732061626f76652031302500006044820152606401610d28565b505050505050565b60125473ffffffffffffffffffffffffffffffffffffffff163314611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420666565206578656d70742073657474657200000000000000000000006044820152606401610d28565b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3360009081526005602052604081205460ff166118bc57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff84160361193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420616c6c6f7765640000000000000000000000000000000000000000006044820152606401610d28565b816000036119d4576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190612b21565b91505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810183905273ffffffffffffffffffffffffffffffffffffffff84169063a9059cbb906044016020604051808303816000875af1158015611a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca49190612b3a565b60005473ffffffffffffffffffffffffffffffffffffffff163314611aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff8116611b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d28565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008184841115611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d28919061275b565b505050900390565b60175460009060ff1615611d5957611d5284848461204d565b9050610ca4565b60115473ffffffffffffffffffffffffffffffffffffffff848116911614801590611d9c575073ffffffffffffffffffffffffffffffffffffffff831661dead14155b8015611dce575073ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff16155b15611e575760135474010000000000000000000000000000000000000000900460ff16611e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f54726164696e67206e6f74206f70656e207965740000000000000000000000006044820152606401610d28565b611e5f612194565b15611e6c57611e6c612203565b6000611e7783610f2e565b9050611f02816040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf39092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812091909155611f35868661257b565b611f3f5781611f77565b601154611f779073ffffffffffffffffffffffffffffffffffffffff888116911614611f6c576000611f6f565b60015b8787856125db565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054909150611faa9082612041565b73ffffffffffffffffffffffffffffffffffffffff80871660008181526001602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61200084610e1c565b60405190815260200160405180910390a350600195945050505050565b6000610ca48284612b57565b6000610ca48284612b0a565b6000610ca48284612b6a565b6000610ca48284612ba5565b60008061205983610f2e565b90506120e4816040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf39092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526001602052604080822093909355908616815220546121209082612041565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526001602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121819087815260200190565b60405180910390a3506001949350505050565b60115460009073ffffffffffffffffffffffffffffffffffffffff1633148015906121c2575060175460ff16155b80156121e957506013547501000000000000000000000000000000000000000000900460ff165b8015610b9857506016546121fc3061117b565b1015905090565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600b54600d54600091612241919061201d565b6016546010549192509061226b9073ffffffffffffffffffffffffffffffffffffffff1682610b02565b5060408051600280825260608201835260009260208301908036833701905050905030816000815181106122a1576122a1612bb8565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601054604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015612320573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123449190612be7565b8160018151811061235757612357612bb8565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526010546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac947906123c3908590600090869030904290600401612c04565b600060405180830381600087803b1580156123dd57600080fd5b505af11580156123f1573d6000803e3d6000fd5b5050600a54479250859150600090612410908390610e4a908690612029565b9050600061242d83610e4a6009548761202990919063ffffffff16565b600e5460405191925060009173ffffffffffffffffffffffffffffffffffffffff9091169061753090859084818181858888f193505050503d8060008114612491576040519150601f19603f3d011682016040523d82523d6000602084013e612496565b606091505b5050600f5460405191925073ffffffffffffffffffffffffffffffffffffffff16906175309084906000818181858888f193505050503d80600081146124f8576040519150601f19603f3d011682016040523d82523d6000602084013e6124fd565b606091505b5050601354909150760100000000000000000000000000000000000000000000900460ff1615612542576014546016541461253a57601454612546565b601554612546565b6016545b6016555050601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081205460ff16158015610ca457505073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205460ff1615919050565b60008060018615151461260457600d546125ff9061271090610e4a905b8690612029565b612618565b600c546126189061271090610e4a906125f8565b9050600060018715151461264657612641600d54610e4a600b548561202990919063ffffffff16565b612661565b612661600c54610e4a6008548561202990919063ffffffff16565b600254909150612671908261201d565b6002556000612680838361201d565b9050801561270857306000908152600160205260409020546126a29082612041565b3060008181526001602052604090209190915573ffffffffffffffffffffffffffffffffffffffff88167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6126f684610e1c565b60405190815260200160405180910390a35b6002546040805184815260208101929092527fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac910160405180910390a161274f858461201d565b98975050505050505050565b60006020808352835180602085015260005b818110156127895785810183015185820160400152820161276d565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f2b57600080fd5b600080604083850312156127fd57600080fd5b8235612808816127c8565b946020939093013593505050565b60006020828403121561282857600080fd5b8135610ca4816127c8565b60008060006060848603121561284857600080fd5b8335612853816127c8565b92506020840135612863816127c8565b929592945050506040919091013590565b8015158114610f2b57600080fd5b60006020828403121561289457600080fd5b8135610ca481612874565b6000602082840312156128b157600080fd5b5035919050565b600080600080608085870312156128ce57600080fd5b84356128d981612874565b9350602085013592506040850135915060608501356128f781612874565b939692955090935050565b6000806040838503121561291557600080fd5b8235612920816127c8565b9150602083013561293081612874565b809150509250929050565b6000806040838503121561294e57600080fd5b8235612959816127c8565b91506020830135612930816127c8565b60008060008060008060c0878903121561298257600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115612a3457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612a1a57612a1a6129ac565b80851615612a2757918102915b93841c93908002906129e0565b509250929050565b600082612a4b57506001610b76565b81612a5857506000610b76565b8160018114612a6e5760028114612a7857612a94565b6001915050610b76565b60ff841115612a8957612a896129ac565b50506001821b610b76565b5060208310610133831016604e8410600b8410161715612ab7575081810a610b76565b612ac183836129db565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612af357612af36129ac565b029392505050565b6000610ca460ff841683612a3c565b8082028115828204841417610b7657610b766129ac565b600060208284031215612b3357600080fd5b5051919050565b600060208284031215612b4c57600080fd5b8151610ca481612874565b81810381811115610b7657610b766129ac565b600082612ba0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610b7657610b766129ac565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bf957600080fd5b8151610ca4816127c8565b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612c6357845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612c31565b505073ffffffffffffffffffffffffffffffffffffffff96909616606085015250505060800152939250505056fea2646970667358221220def786b5f32cf1420da9831a644218fff06590fcd32c27cc1bec667f4e98c62e64736f6c63430008180033

Deployed Bytecode

0x6080604052600436106103595760003560e01c8063715018a6116101bb578063b0f7ec38116100f7578063eae436d511610095578063f84ba65d1161006f578063f84ba65d14610a6d578063f887ea4014610a8d578063fb5f27fb14610aba578063ffb54a9914610ad057600080fd5b8063eae436d514610a0d578063f0a9e36514610a2d578063f2fde38b14610a4d57600080fd5b8063c458d314116100d1578063c458d31414610940578063cb29813c1461096d578063dd62ed3e1461098d578063e96fada2146109e057600080fd5b8063b0f7ec38146108d7578063b93bdb5f1461090a578063beb899e01461092b57600080fd5b80638b42507f11610164578063a4b45c001161013e578063a4b45c0014610854578063a8aa1b3114610874578063a9059cbb146108a1578063ac45ed1c146108c157600080fd5b80638b42507f146107de5780638da5cb5b1461079e57806395d89b411461080e57600080fd5b806384f6820a1161019557806384f6820a14610788578063893d20e81461079e5780638a8c523c146107c957600080fd5b8063715018a614610731578063832790fe1461074657806383a2bcea1461076857600080fd5b8063313ce567116102955780635314841611610233578063613f930f1161020d578063613f930f1461068c5780636308fb98146106d1578063658d4b7f146106f157806370a082311461071157600080fd5b80635314841614610629578063571ac8b01461063f5780635d4014601461065f57600080fd5b80633f4218e01161026f5780633f4218e01461057157806340291143146105a1578063409d0566146105f357806345ce53651461060957600080fd5b8063313ce5671461052a578063364333f4146105465780633b32f37c1461055b57600080fd5b80631780028711610302578063272b1323116102dc578063272b1323146104b15780632b112e49146104d35780632d44c931146104e85780632d8381191461050a57600080fd5b8063178002871461046657806318160ddd1461047c57806323b872dd1461049157600080fd5b80630cfc15f9116103335780630cfc15f91461040d57806310075a691461043a57806313374e7a1461045057600080fd5b80630445b6671461036557806306fdde031461038e578063095ea7b3146103dd57600080fd5b3661036057005b600080fd5b34801561037157600080fd5b5061037b60165481565b6040519081526020015b60405180910390f35b34801561039a57600080fd5b5060408051808201909152600981527f426c6173744d6f6f6e000000000000000000000000000000000000000000000060208201525b604051610385919061275b565b3480156103e957600080fd5b506103fd6103f83660046127ea565b610b02565b6040519015158152602001610385565b34801561041957600080fd5b5061037b610428366004612816565b60016020526000908152604090205481565b34801561044657600080fd5b5061037b60075481565b34801561045c57600080fd5b5061037b600a5481565b34801561047257600080fd5b5061037b60025481565b34801561048857600080fd5b5061037b610b7c565b34801561049d57600080fd5b506103fd6104ac366004612833565b610b9d565b3480156104bd57600080fd5b506104d16104cc366004612816565b610cab565b005b3480156104df57600080fd5b5061037b610ddf565b3480156104f457600080fd5b5061037b610503366004612882565b50600d5490565b34801561051657600080fd5b5061037b61052536600461289f565b610e1c565b34801561053657600080fd5b5060405160128152602001610385565b34801561055257600080fd5b506104d1610e50565b34801561056757600080fd5b5061037b60065481565b34801561057d57600080fd5b506103fd61058c366004612816565b60046020526000908152604090205460ff1681565b3480156105ad57600080fd5b50600f546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610385565b3480156105ff57600080fd5b5061037b60085481565b34801561061557600080fd5b5061037b61062436600461289f565b610f2e565b34801561063557600080fd5b5061037b600d5481565b34801561064b57600080fd5b506103fd61065a366004612816565b610f5b565b34801561066b57600080fd5b506013546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561069857600080fd5b50600754600654600854600c546127105b604080519586526020860194909452928401919091526060830152608082015260a001610385565b3480156106dd57600080fd5b506104d16106ec3660046128b8565b610f87565b3480156106fd57600080fd5b506104d161070c366004612902565b6110a4565b34801561071d57600080fd5b5061037b61072c366004612816565b61117b565b34801561073d57600080fd5b506104d16111aa565b34801561075257600080fd5b5061037b610761366004612882565b50600c5490565b34801561077457600080fd5b506104d1610783366004612816565b61129a565b34801561079457600080fd5b5061037b60095481565b3480156107aa57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166105ce565b3480156107d557600080fd5b506104d16113df565b3480156107ea57600080fd5b506103fd6107f9366004612816565b60056020526000908152604090205460ff1681565b34801561081a57600080fd5b5060408051808201909152600581527f424d4f4f4e00000000000000000000000000000000000000000000000000000060208201526103d0565b34801561086057600080fd5b506104d161086f36600461293b565b6114a1565b34801561088057600080fd5b506011546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108ad57600080fd5b506103fd6108bc3660046127ea565b611575565b3480156108cd57600080fd5b5061037b600b5481565b3480156108e357600080fd5b506013546103fd907501000000000000000000000000000000000000000000900460ff1681565b34801561091657600080fd5b50600a54600954600b54600d546127106106a9565b34801561093757600080fd5b506104d1611582565b34801561094c57600080fd5b506012546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561097957600080fd5b506104d1610988366004612969565b61162d565b34801561099957600080fd5b5061037b6109a836600461293b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b3480156109ec57600080fd5b50600e546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a1957600080fd5b506104d1610a28366004612816565b6117d8565b348015610a3957600080fd5b506103fd610a483660046127ea565b6118a0565b348015610a5957600080fd5b506104d1610a68366004612816565b611a6b565b348015610a7957600080fd5b506104d1610a88366004612902565b611c1c565b348015610a9957600080fd5b506010546105ce9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610ac657600080fd5b5061037b600c5481565b348015610adc57600080fd5b506013546103fd9074010000000000000000000000000000000000000000900460ff1681565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610b6a9086815260200190565b60405180910390a35060015b92915050565b6000610b8a6012600a612afb565b610b98906305f5e100612b0a565b905090565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610c9657604080518082018252601681527f496e73756666696369656e7420416c6c6f77616e63650000000000000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600382528381203382529091529190912054610c64918490611cf3565b73ffffffffffffffffffffffffffffffffffffffff851660009081526003602090815260408083203384529091529020555b610ca1848484611d39565b90505b9392505050565b60135473ffffffffffffffffffffffffffffffffffffffff163314610d31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420626c617374206f70657261746f72000000000000000000000000000060448201526064015b60405180910390fd5b6040517f954fa5ee00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff821660248201527343000000000000000000000000000000000000029063954fa5ee906044016020604051808303816000875af1158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddb9190612b21565b5050565b6000610b98610dee600061117b565b610e16610dfc61dead61117b565b610e086012600a612afb565b610e16906305f5e100612b0a565b9061201d565b6000610b76600254610e4a6012600a610e359190612afb565b610e43906305f5e100612b0a565b8590612029565b90612035565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ed1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b604051600090339061753090479084818181858888f193505050503d8060008114610f18576040519150601f19603f3d011682016040523d82523d6000602084013e610f1d565b606091505b5050905080610f2b57600080fd5b50565b6000610b76610f3f6012600a612afb565b610f4d906305f5e100612b0a565b600254610e4a908590612029565b6000610b76827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610b02565b60005473ffffffffffffffffffffffffffffffffffffffff163314611008576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b601380549415157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff92151576010000000000000000000000000000000000000000000002929092167fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff90951694909417179092556014819055601591909155601655565b60125473ffffffffffffffffffffffffffffffffffffffff163314611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420666565206578656d70742073657474657200000000000000000000006044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812054610b7690610e1c565b60005473ffffffffffffffffffffffffffffffffffffffff16331461122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60135473ffffffffffffffffffffffffffffffffffffffff16331461131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7420626c617374206f70657261746f7200000000000000000000000000006044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff8116611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f496e76616c6964206164647265737300000000000000000000000000000000006044820152606401610d28565b601380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b601380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b600e805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600f8054929093169116179055565b6000610ca4338484611d39565b60125473ffffffffffffffffffffffffffffffffffffffff163314611603576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420666565206578656d70742073657474657200000000000000000000006044820152606401610d28565b601280547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b6008869055600785905560068490556116d1846116cb8888612041565b90612041565b600c55600b839055600a82905560098190556116f1816116cb8585612041565b600d55600c546103e81015611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f43616e6e6f74207365742062757920666565732061626f7665203130250000006044820152606401610d28565b6103e8600d5411156117d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f43616e6e6f74207365742073656c6c20666565732061626f76652031302500006044820152606401610d28565b505050505050565b60125473ffffffffffffffffffffffffffffffffffffffff163314611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420666565206578656d70742073657474657200000000000000000000006044820152606401610d28565b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3360009081526005602052604081205460ff166118bc57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff84160361193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420616c6c6f7765640000000000000000000000000000000000000000006044820152606401610d28565b816000036119d4576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190612b21565b91505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810183905273ffffffffffffffffffffffffffffffffffffffff84169063a9059cbb906044016020604051808303816000875af1158015611a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca49190612b3a565b60005473ffffffffffffffffffffffffffffffffffffffff163314611aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff8116611b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d28565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d28565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008184841115611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d28919061275b565b505050900390565b60175460009060ff1615611d5957611d5284848461204d565b9050610ca4565b60115473ffffffffffffffffffffffffffffffffffffffff848116911614801590611d9c575073ffffffffffffffffffffffffffffffffffffffff831661dead14155b8015611dce575073ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff16155b15611e575760135474010000000000000000000000000000000000000000900460ff16611e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f54726164696e67206e6f74206f70656e207965740000000000000000000000006044820152606401610d28565b611e5f612194565b15611e6c57611e6c612203565b6000611e7783610f2e565b9050611f02816040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf39092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040812091909155611f35868661257b565b611f3f5781611f77565b601154611f779073ffffffffffffffffffffffffffffffffffffffff888116911614611f6c576000611f6f565b60015b8787856125db565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054909150611faa9082612041565b73ffffffffffffffffffffffffffffffffffffffff80871660008181526001602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61200084610e1c565b60405190815260200160405180910390a350600195945050505050565b6000610ca48284612b57565b6000610ca48284612b0a565b6000610ca48284612b6a565b6000610ca48284612ba5565b60008061205983610f2e565b90506120e4816040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cf39092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff80871660009081526001602052604080822093909355908616815220546121209082612041565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526001602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121819087815260200190565b60405180910390a3506001949350505050565b60115460009073ffffffffffffffffffffffffffffffffffffffff1633148015906121c2575060175460ff16155b80156121e957506013547501000000000000000000000000000000000000000000900460ff165b8015610b9857506016546121fc3061117b565b1015905090565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600b54600d54600091612241919061201d565b6016546010549192509061226b9073ffffffffffffffffffffffffffffffffffffffff1682610b02565b5060408051600280825260608201835260009260208301908036833701905050905030816000815181106122a1576122a1612bb8565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601054604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015612320573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123449190612be7565b8160018151811061235757612357612bb8565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526010546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac947906123c3908590600090869030904290600401612c04565b600060405180830381600087803b1580156123dd57600080fd5b505af11580156123f1573d6000803e3d6000fd5b5050600a54479250859150600090612410908390610e4a908690612029565b9050600061242d83610e4a6009548761202990919063ffffffff16565b600e5460405191925060009173ffffffffffffffffffffffffffffffffffffffff9091169061753090859084818181858888f193505050503d8060008114612491576040519150601f19603f3d011682016040523d82523d6000602084013e612496565b606091505b5050600f5460405191925073ffffffffffffffffffffffffffffffffffffffff16906175309084906000818181858888f193505050503d80600081146124f8576040519150601f19603f3d011682016040523d82523d6000602084013e6124fd565b606091505b5050601354909150760100000000000000000000000000000000000000000000900460ff1615612542576014546016541461253a57601454612546565b601554612546565b6016545b6016555050601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604081205460ff16158015610ca457505073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205460ff1615919050565b60008060018615151461260457600d546125ff9061271090610e4a905b8690612029565b612618565b600c546126189061271090610e4a906125f8565b9050600060018715151461264657612641600d54610e4a600b548561202990919063ffffffff16565b612661565b612661600c54610e4a6008548561202990919063ffffffff16565b600254909150612671908261201d565b6002556000612680838361201d565b9050801561270857306000908152600160205260409020546126a29082612041565b3060008181526001602052604090209190915573ffffffffffffffffffffffffffffffffffffffff88167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6126f684610e1c565b60405190815260200160405180910390a35b6002546040805184815260208101929092527fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac910160405180910390a161274f858461201d565b98975050505050505050565b60006020808352835180602085015260005b818110156127895785810183015185820160400152820161276d565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f2b57600080fd5b600080604083850312156127fd57600080fd5b8235612808816127c8565b946020939093013593505050565b60006020828403121561282857600080fd5b8135610ca4816127c8565b60008060006060848603121561284857600080fd5b8335612853816127c8565b92506020840135612863816127c8565b929592945050506040919091013590565b8015158114610f2b57600080fd5b60006020828403121561289457600080fd5b8135610ca481612874565b6000602082840312156128b157600080fd5b5035919050565b600080600080608085870312156128ce57600080fd5b84356128d981612874565b9350602085013592506040850135915060608501356128f781612874565b939692955090935050565b6000806040838503121561291557600080fd5b8235612920816127c8565b9150602083013561293081612874565b809150509250929050565b6000806040838503121561294e57600080fd5b8235612959816127c8565b91506020830135612930816127c8565b60008060008060008060c0878903121561298257600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115612a3457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612a1a57612a1a6129ac565b80851615612a2757918102915b93841c93908002906129e0565b509250929050565b600082612a4b57506001610b76565b81612a5857506000610b76565b8160018114612a6e5760028114612a7857612a94565b6001915050610b76565b60ff841115612a8957612a896129ac565b50506001821b610b76565b5060208310610133831016604e8410600b8410161715612ab7575081810a610b76565b612ac183836129db565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612af357612af36129ac565b029392505050565b6000610ca460ff841683612a3c565b8082028115828204841417610b7657610b766129ac565b600060208284031215612b3357600080fd5b5051919050565b600060208284031215612b4c57600080fd5b8151610ca481612874565b81810381811115610b7657610b766129ac565b600082612ba0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610b7657610b766129ac565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612bf957600080fd5b8151610ca4816127c8565b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612c6357845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612c31565b505073ffffffffffffffffffffffffffffffffffffffff96909616606085015250505060800152939250505056fea2646970667358221220def786b5f32cf1420da9831a644218fff06590fcd32c27cc1bec667f4e98c62e64736f6c63430008180033

[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.