ETH Price: $2,956.68 (-1.86%)
Gas: 3 Gwei

Token

MCGA (MCGA)
 

Overview

Max Total Supply

100,000,000 MCGA

Holders

145

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
500,000 MCGA

Value
$0.00
0x310e0565b3d000ca4bb4c81cb548f132a35a053d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
StarBaseNoLockerERC20

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-05-21
*/

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@&%&@&&&&@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&@@@@&&@@&&@@@&&&&&&&#/(&%##&@&&&&&&&&@@@&&&&&&@@@@&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&@@@@@@@@@@@@@@@&&&%%%&&&&&&%/*(&%(/#&&&&&&&&&&&@@@@@@@@@@@@&&&@@&&&&&&&&&&&&
//&&&&&&&&&&&&&@@@@@@@@@@@@@&&%%%%%%%&&&&@&#,,(&%(*(%@&&&%%%%%%%%&&@@@@@@@@@@@@&&&&&&&&&&&&&
//&&&&&&&&&&@&&@@@@@@@@@@&&%###%%%%&&@@@@@&(.,(&%(**%@@@@&&&%%%%%%#%%&@@@@@@@@@&&&&&&&&&&&&&
//&&&&&&&&&&&&&@@@@@@@@@#//#%%%%&@@@@@@@@@%* ,(&%(*,(@@@@@&&&&&&%%%%#/(&@@@&@@@&&&&&&&&&&&&&
//&&&&&&&&&&&&@@@@@@@&%*,/#%%&&@@@@@@@@@@@#, ,(&&#*.(&@@@@@@@@@@@&%%%#/*#&@@@&@@@&&&&&&&&&&&
//&&&&&&&&&&&@@@@@@@@(,,(%%%&@@@@@@@@@@@@@#. ,(&&#*./%@@@@@@@@@@@@&&%%%/,/%@@&@&&&&&&&&&&&&&
//&&&&&&&&&&&&@@@@@@(,,(%%%&@@@@@@@@@@@@@@(. ,(&&#*.*%@@&@@@@@@@@@@&%&&%/*/&@@@&&&&&&&&&&&&&
//&&&&&&&&&&&&@@@@&%,,(&%%&@@@@@@@@@@@@@@&/../#&&%/.*%@@@@@@@@@@&@@@&%%&%/.(&@@@@&&&&&&&&&&&
//&&&&&&&&&&&@&&@@%*.*(%%&@@@@@@@@@@@@@@@%/.*/#&&%/.,(@@@@@@@&&&&&&@@&&&%(,,#@&@&&&&&&&&&&&&
//&&&&&&&&&&&&&@&@#,,/%%%&@@@@@@@@@@@@@@@#*.#%%&&#/.,(&@@@@@@&&&&&&@@&&%%#*./&@@&&&&&&&&&&&&
//&&&&&&&&&&&@@@&&#..(&%%&@@@@@@@@@@@@@&%#*  /%&@%/.*(%&@@@@@@@@@@@&&&%%&#* /%@&&&&&&&&&&&&&
//&&&&&&&&&&&@@@@&#.,/%%%&@@@@@@@@@@@@&%%%(..*#%%&&,*#&%&@@@@@@@@@@@@&&%%#*./%@&&&&&&&&&&&&&
//&&&&&&&&&&&@&&@@#. .*#%&@@@@@@@@@@@@%%%%(,,/#&&%#,/#&%%&@@@@&&&@@&@&&%(, .(&@@&&&&&&&&&&&&
//&&&&&&&&&&&&&&@@%/,,*/#%@@@@@@@&@@@%%%%%(..*#&%#*.*#&%#%&@&&@@@@@@&%#(/***#@@@&&&&&&&&&&&&
//&&&&&&&&&&&@@@@@&%*,,*#%&@@@@@@@@@&##%%%(*,*(##/*,/#%%##&&@@&@@&&&&%#(*,,(&@&&&&&&&&&&&&&&
//&&&&&&&&&&&&&@&@@@#/**(%&%&@@@@@@&%##%##(/,*/(//**(######&@&&&@&&%%%#(((#&@@&@@&&&&&&&&&&&
//&&&&&&&&&&&@@@&@@@@%(*/(#%%&&&@@&%(%%####(**///***(%%##%##&@@@@&%%%####%&@@@@@@&&&&&&&&&&&
//&&&&&&&&&&&@&&&@@@@@&#**(%%%%%&@%##%&&&%#(****/*,/#%&&&%%##&&&%%&&%%%%&&@@@@@@&&&&&&&&&&&&
//&&&&&&&&&&&&&@@@@&@@@@&(,*(%%%%%%%%&&&%##((//(((/((#&&&&&&%%&&&&&%%%&@@@&@@@&&&&&&&&&&&&&&
//&&&&&&&&&&&&@@@@@&@@&@@@&(/(%%&&%%%%%%##%%((###((%%##%&%%%&&&&&&%%&@@@@@@@@@@&&&&&&&&&&&&&
//&&&&&&&&&&&&&&@@@@@@@@@@@@@&###%&&&&&%%%%%#%%#####%%%%%&&&&&&&&&@@@@@@@@@@@@@@&&&&&&&&&&&&
//&&&&&&&&&&&@@@&@@@&#(%&@@@@@&@@&&&&&&%%%%&&&%(%&&&%%%%&&&&&&&@@@@@@@@&%&@@@@&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&@@&&/,*%(/(%&&@@@@&&@&&&&%&&%%%%%%%&&&&&&@@@@@@@@@&%/##(.,#&@@@&&&&&&&&&&&&&
//&&&&&&&&&&&&@@&@@@%#%#/(%**/%((%&&&&@@@@@@@@@&@@@&&@&&@@&&&####*/#/*/%##%&&&@@&&&&&&&&&&&&
//&&&&&&&&&&&&&@@&&@&&&@@&(*/(*,*%**/#/*(###((%@&%(&@%//(#,,/(,*#/**%&&@@@&&@@&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&@&@&&&&&@&&%*/(/,,(//(,/#@&#*%@&(,,(/#&%%%&@@@&&&@@&&&@&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&@&@&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&



// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@                                                                                                @@
// @@   This token was launched using StarBase. To learn more or to launch                           @@
// @@   your own token, visit: https://starbase.services                                             @@
// @@                                                                                                @@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


 


/**
 Make China Great Again 
*/
//Telegram:  https://t.me/MCGAETH 
// Website:  MCGAETH.COM 
//Twitter: https://x.com/mcgatoken  
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;



interface IERCBurn {
    function burn(uint256 _amount) external;
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external returns (uint256);
    function balanceOf(address account) external view returns (uint256);
}
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
/**
 * @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();
        }
    }
}

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position is the index of the value in the `values` array plus 1.
        // Position 0 is used to mean a value is not in the set.
        mapping(bytes32 value => uint256) _positions;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._positions[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We cache the value's position to prevent multiple reads from the same storage slot
        uint256 position = set._positions[value];

        if (position != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 valueIndex = position - 1;
            uint256 lastIndex = set._values.length - 1;

            if (valueIndex != lastIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the lastValue to the index where the value to delete is
                set._values[valueIndex] = lastValue;
                // Update the tracked position of the lastValue (that was just moved)
                set._positions[lastValue] = position;
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the tracked position for the deleted slot
            delete set._positions[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._positions[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }



    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Locker {
  struct UserInfo {
    EnumerableSet.AddressSet lockedTokens; // records all tokens the user has locked
    mapping(address => uint256[]) locksForToken; // map erc20 address to lock id for that token
  }

  struct TokenLock {
    uint256 lockDate; // the date the token was locked
    uint256 amount; // the amount of tokens still locked (initialAmount minus withdrawls)
    uint256 initialAmount; // the initial lock amount
    uint256 unlockDate; // the date the token can be withdrawn
    uint256 lockID; // lockID nonce per uni pair
    address owner;
  }

  struct FeeStruct {
    uint256 ethFee; // Small eth fee to prevent spam on the platform
    IERCBurn secondaryFeeToken; // UNCX or UNCL
    uint256 secondaryTokenFee; // optional, UNCX or UNCL
    uint256 secondaryTokenDiscount; // discount on liquidity fee for burning secondaryToken
    uint256 liquidityFee; // fee on univ2 liquidity tokens
    uint256 referralPercent; // fee for referrals
    IERCBurn referralToken; // token the refferer must hold to qualify as a referrer
    uint256 referralHold; // balance the referrer must hold to qualify as a referrer
    uint256 referralDiscount; // discount on flatrate fees for using a valid referral address
  }

  function setDev(address payable _devaddr) external;


  function setSecondaryFeeToken(address _secondaryFeeToken) external;

  /**
   * @notice referrers need to hold the specified token and hold amount to be elegible for referral fees
   */
  function setReferralTokenAndHold(
    IERCBurn _referralToken,
    uint256 _hold
  ) external;

  function setFees(
    uint256 _referralPercent,
    uint256 _referralDiscount,
    uint256 _ethFee,
    uint256 _secondaryTokenFee,
    uint256 _secondaryTokenDiscount,
    uint256 _liquidityFee
  ) external;

  /**
   * @notice whitelisted accounts dont pay flatrate fees on locking
   */
  function whitelistFeeAccount(address _user, bool _add) external;

  /**
   * @notice Creates a new lock
   * @param _lpToken the univ2 token address
   * @param _amount amount of LP tokens to lock
   * @param _unlock_date the unix timestamp (in seconds) until unlock
   * @param _referral the referrer address if any or address(0) for none
   * @param _fee_in_eth fees can be paid in eth or in a secondary token such as UNCX with a discount on univ2 tokens
   * @param _withdrawer the user who can withdraw liquidity once the lock expires.
   */
  function lockLPToken(
    address _lpToken,
    uint256 _amount,
    uint256 _unlock_date,
    address payable _referral,
    bool _fee_in_eth,
    address payable _withdrawer
  ) external payable;

  /**
   * @notice extend a lock with a new unlock date, _index and _lockID ensure the correct lock is changed
   * this prevents errors when a user performs multiple tx per block possibly with varying gas prices
   */
  function relock(
    address _lpToken,
    uint256 _index,
    uint256 _lockID,
    uint256 _unlock_date
  ) external;

  /**
   * @notice withdraw a specified amount from a lock. _index and _lockID ensure the correct lock is changed
   * this prevents errors when a user performs multiple tx per block possibly with varying gas prices
   */
  function withdraw(
    address _lpToken,
    uint256 _index,
    uint256 _lockID,
    uint256 _amount
  ) external;

  /**
   * @notice increase the amount of tokens per a specific lock, this is preferable to creating a new lock, less fees, and faster loading on our live block explorer
   */
  function incrementLock(
    address _lpToken,
    uint256 _index,
    uint256 _lockID,
    uint256 _amount
  ) external;

  /**
   * @notice split a lock into two seperate locks, useful when a lock is about to expire and youd like to relock a portion
   * and withdraw a smaller portion
   */
  function splitLock(
    address _lpToken,
    uint256 _index,
    uint256 _lockID,
    uint256 _amount
  ) external payable;

  /**
   * @notice transfer a lock to a new owner, e.g. presale project -> project owner
   */
  function transferLockOwnership(
    address _lpToken,
    uint256 _index,
    uint256 _lockID,
    address payable _newOwner
  ) external;

  /**
   * @notice migrates liquidity to uniswap v3
   */
  function migrate(
    address _lpToken,
    uint256 _index,
    uint256 _lockID,
    uint256 _amount
  ) external;

  function getNumLocksForToken(
    address _lpToken
  ) external view returns (uint256);

  function getNumLockedTokens() external view returns (uint256);

  function getLockedTokenAtIndex(
    uint256 _index
  ) external view returns (address);

  // user functions
  function getUserNumLockedTokens(
    address _user
  ) external view returns (uint256);

  function getUserLockedTokenAtIndex(
    address _user,
    uint256 _index
  ) external view returns (address);

  function getUserNumLocksForToken(
    address _user,
    address _lpToken
  ) external view returns (uint256);

  function getUserLockForTokenAtIndex(
    address _user,
    address _lpToken,
    uint256 _index
  )
    external
    view
    returns (uint256, uint256, uint256, uint256, uint256, address);

  // whitelist
  function getWhitelistedUsersLength() external view returns (uint256);

  function getWhitelistedUserAtIndex(
    uint256 _index
  ) external view returns (address);

  function getUserWhitelistStatus(address _user) external view returns (bool);
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

interface IAgoraERC20Config {

    /**
     * @dev information used to construct the token.
     */
    struct TokenConstructorParameters {
        bytes baseParameters;
        bytes taxParameters;
        bytes tokenLPInfo;
    }

    /**
     * @dev Basic info of the token
     */
    struct TokenInfoParameters {
        string name;
        string symbol;
        bool autoCreateLiquidity;
        uint256 maxSupply;
        address tokensRecepient;
        uint256 maxTokensWallet;
        bool payInTax;
        bool protectLiquidity;
    }

    /**
     *  @dev This struct express the taxes on per 1000, to allow percetanges between 0 and 1. 
     */
    struct TaxParameters {
        uint256 buyTax;
        uint256 sellTax;
        uint256 lpBuyTax;
        uint256 lpSellTax;
        uint256 maxTxBuy;
        uint256 maxTxSell;
        address taxSwapRecepient;
    }

    /**
     * @dev Liquidity pool supply information
     */
    struct TokenLpInfo {
        uint256 lpTokensupply;
        uint256 ethForSupply;
        bool burnLP;
        uint256 lockFee;
        uint256 lpLockUpInDays;
    }
}

interface IAgoraERC20 is IAgoraERC20Config, IERC20, IERC20Metadata {
    function addLiquidity() external payable returns (address);

    event LiquidityLocked(uint256 lpTokens, uint256 daysLocked);
    event TaxChanged(
        uint256 previousBuyTax,
        uint256 previousSellTax,
        uint256 newBuyTax,
        uint256 newSellTax
    );
    event LPTaxChanged(
        uint256 previousBuyTax,
        uint256 previousSellTax,
        uint256 newBuyTax,
        uint256 newSellTax
    );
    event LiquidityAdded(
        uint256 tokensSupplied,
        uint256 ethSupplied,
        uint256 lpTokensIssued
    );
    event LimitsRaised(
        uint128 oldBuyLimit,
        uint128 oldSellLimit,
        uint128 oldMaxWallet,
        uint128 newBuyLimit,
        uint128 newSellLimit,
        uint128 newMaxWallet
    );
    event LiquidityBurned(uint256 liquidityBurned);
    event LiquiditySupplied(uint256 tokens, uint256 eth);
    event ExternalCallError(uint256);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Revertible {
    function _revert(bytes4 errorSelector) internal pure {
        assembly {
            mstore(0x00, errorSelector)
            revert(0x00, 0x04)
        }
    }
}

interface IAgoraErrors {

    error NotEnoughBalance();

    error CallerIsNotTheOwner();
    error CannotSetNewOwnerToTheZeroAddress();
    error TaxesCanNotBeRaised();
    error ApproveFromTheZeroAddress();
    error ApproveToTheZeroAddress();
    error OperationNotAllowed();
    error BurnFromTheZeroAddress();
    error BurnExceedsBalance();
    error MintToZeroAddress();
    error LpTokensExceedsTotalSupply();
    error TooFewLPTokens();
    error LPAlreadyCreated();
    error NotEnoughFundsForLP();
    error HardCapIsTooHigh();
    error LPNotInit();
    error TransactionIsTooBig();
    error LimitsLoweringIsNotAllowed();
    error MaxWalletExceeded();
    error InsufficientAllowance();
}

abstract contract Ownable is Revertible, Context, IAgoraErrors {
    address private _owner;

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            _revert(CallerIsNotTheOwner.selector);
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            _revert(CannotSetNewOwnerToTheZeroAddress.selector);
        }
        _transferOwnership(newOwner);
    }

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

abstract contract StarBaseAbstractERC20 is IAgoraERC20, Ownable {
    bytes32 public constant x_ID_HASH =
    0xb07887f9e6857c947639357c810260e93a866b112197fa793b96ffe10082a244;

    using EnumerableSet for EnumerableSet.AddressSet;
    using EnumerableSet for EnumerableSet.Bytes32Set;

    /** @dev {_balances} Addresses balances */
    mapping(address => uint256) internal _balances;

    /** @dev {_allowances} Addresses allocance details */
    mapping(address => mapping(address => uint256)) private _allowances;

    /** @dev {_unlimited} Enumerable set for addresses where limits do not apply */
    EnumerableSet.AddressSet internal _excludedFromLimits;

    // Config
    IUniswapV2Router02 internal immutable _uniswapRouter;
    uint256 internal constant MAX_SWAP_THRESHOLD_MULTIPLE = 20;
    uint256 internal constant CALL_GAS_LIMIT = 50000;
    address public immutable factory;
    address public immutable startShipVault;
    address public taxRecipient;
    string private _name;
    string private _symbol;

    uint128 private _totalSupply;

    // Tax
    bool private _hasTax;
    uint16 public buyTax;
    uint16 public sellTax;
    bool private _hasLPTax;
    uint16 public buyLPTax;
    uint16 public sellLPTax;
    uint128 public accumulatedTax;
    uint128 public starShipAccumulatedTax;
    uint128 public lpAccumulatedTax;
    bool public autoConversion;
    uint16 public starShipTaxPoints = 5;
    bool public shouldPayInTax;

    // Liquidty info
    uint32 public lpCreatedDate;
    address public pairAddress;
    bool public burnLiquidity;
    bool internal _IsInConversion;
    uint16 public pctForSwap; // Per thousands
    uint128 public tokensThreshHoldForSwap;
    uint128 public lockFee;
    uint256 public liquidityLockedInDays;
    uint128 public initialLiquidityFunds;
    uint256 public lockedUntil;

    // Caps
    uint128 public buyMaxTx;
    uint128 public sellMaxTx;
    uint128 public maxWallet;

    modifier onlyFactoryOrOwner() {
        if (msg.sender != factory && msg.sender != owner()) {
            _revert(OperationNotAllowed.selector);
        }
        _;
    }

    constructor(
        address[5] memory addresses_,
        bytes memory tokenInfo_,
        bytes memory taxesInfo_,
        bytes memory lpInfo_
    ) {
        pctForSwap = 5;
        transferOwnership(addresses_[0]);
        _uniswapRouter = IUniswapV2Router02(addresses_[1]);
        factory = addresses_[3];
        startShipVault = addresses_[4];
        TokenInfoParameters memory tokenParameters = abi.decode(
            tokenInfo_,
            (TokenInfoParameters)
        );

        _name = tokenParameters.name;
        _symbol = tokenParameters.symbol;

        shouldPayInTax = tokenParameters.payInTax;

        tokensThreshHoldForSwap = tokensThreshHoldForSwap;

        if (type(uint128).max < tokenParameters.maxTokensWallet) {
            _revert(HardCapIsTooHigh.selector);
        }

        maxWallet = uint128(tokenParameters.maxTokensWallet);
        TaxParameters memory taxParams = abi.decode(taxesInfo_, (TaxParameters));
        _processLimits(taxParams);

        taxRecipient = taxParams.taxSwapRecepient;
        TokenLpInfo memory tokenLpInfo = abi.decode(lpInfo_, (TokenLpInfo));
        _processSupply(tokenParameters, tokenLpInfo);
        burnLiquidity = tokenLpInfo.burnLP;
        lockFee = uint128(tokenLpInfo.lockFee);
        liquidityLockedInDays = tokenLpInfo.lpLockUpInDays;
        initialLiquidityFunds = uint128(tokenLpInfo.ethForSupply);

        _excludedFromLimits.add(address(_uniswapRouter));
        pairAddress = IUniswapV2Factory(_uniswapRouter.factory()).createPair(
            address(this),
            _uniswapRouter.WETH()
        );
        _excludedFromLimits.add(pairAddress);
        _excludedFromLimits.add(address(this));
        _excludedFromLimits.add(address(0));
        _excludedFromLimits.add(owner());
        _approve(address(this), address(_uniswapRouter), type(uint256).max);
        _approve(address(this), pairAddress, type(uint256).max);
    }

    // ###########################################
    // ERC 20 INTERFACE IMPLEMENTATION
    // ###########################################

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

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

        _totalSupply += uint128(amount);
        unchecked {
        // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

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

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

    /**
 * @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) {
        return _allowances[owner][spender];
    }

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

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

        if (spender == address(0)) {
            _revert(ApproveToTheZeroAddress.selector);
        }

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

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

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

        uint256 accountBalance = _balances[account];
        if (accountBalance < amount) {
            _revert(BurnExceedsBalance.selector);
        }

        unchecked {
            _balances[account] = accountBalance - amount;
        // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= uint128(amount);
        }

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

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

    /**
     * @dev Destroys a `value` amount of tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }

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

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

        _safeGuardTransfer(from, to, amount);

        uint128 realAmount = _applyTaxes(from, to, amount);

        _swapTaxes(from, to);

        unchecked {
            _balances[from] -= amount;
            _balances[to] += realAmount;
        }
        emit Transfer(from, to, realAmount);
        return true;
    }

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


    function _applyTaxes(
        address from_,
        address to_,
        uint256 amount_
    ) internal returns (uint128) {
        uint128 taxedAmount = uint128(amount_);
        uint128 taxAmount = 0;
        uint128 starshipTax = 0;
        uint128 lpTax = 0;
        if (_shouldApplyTax() && !_IsInConversion) {
            if (from_ == pairAddress && !_excludedFromLimits.contains(to_)) {
                if (buyTax > 0) {
                    taxAmount = (taxedAmount * buyTax) / 1000;
                }

                if (shouldPayInTax) {
                    starshipTax = (taxedAmount * starShipTaxPoints) / 1000;
                    starShipAccumulatedTax += starshipTax;
                }

                if (_hasLPTax && buyLPTax > 0) {
                    lpTax += (taxedAmount * buyLPTax) / 1000;
                    lpAccumulatedTax += lpTax;
                }
            } else if (
                to_ == pairAddress && !_excludedFromLimits.contains(from_)
            ) {
                if (sellTax > 0) {
                    taxAmount = (taxedAmount * sellTax) / 1000;
                }
                if (shouldPayInTax) {
                    starshipTax = (taxedAmount * starShipTaxPoints) / 1000;
                    starShipAccumulatedTax += starshipTax;
                }

                if (_hasLPTax && sellLPTax > 0) {
                    lpTax += (taxedAmount * sellLPTax) / 1000;
                    lpAccumulatedTax += lpTax;
                }
            }

            if (taxAmount > 0 || starshipTax > 0 || lpTax > 0) {
                unchecked {
                    accumulatedTax += taxAmount;
                    _balances[address(this)] += taxAmount + starshipTax + lpTax;
                }

                emit Transfer(
                    from_,
                    address(this),
                    taxAmount + starshipTax + lpTax
                );
            }
        }

        return taxedAmount - starshipTax - taxAmount - lpTax;
    }

    function _shouldApplyTax() internal view returns (bool) {
        return _hasTax || shouldPayInTax || _hasLPTax;
    }

    function _buyTax() internal view returns (uint16) {
        return shouldPayInTax ? buyTax + starShipTaxPoints : buyTax;
    }

    function _sellTax() internal view returns (uint16) {
        return shouldPayInTax ? sellTax + starShipTaxPoints : sellTax;
    }

   /**
     * Reads and stores the relevant information about the taxes.
     * @param taxParams_ Tax configuration
     */
    function _processLimits(TaxParameters memory taxParams_) internal {
        if (
            type(uint128).max < taxParams_.maxTxSell ||
            type(uint128).max < taxParams_.maxTxBuy
        ) {
            _revert(HardCapIsTooHigh.selector);
        }

        buyMaxTx = uint128(taxParams_.maxTxBuy);
        sellMaxTx = uint128(taxParams_.maxTxSell);

        if (taxParams_.buyTax == 0 && taxParams_.sellTax == 0) {
            _hasTax = false;
        } else {
            _hasTax = true;
            buyTax = uint16(taxParams_.buyTax);
            sellTax = uint16(taxParams_.sellTax);
        }

        if (taxParams_.lpBuyTax == 0 && taxParams_.lpSellTax == 0) {
            _hasLPTax = false;
        } else {
            _hasLPTax = true;
            buyLPTax = uint16(taxParams_.lpBuyTax);
            sellLPTax = uint16(taxParams_.lpSellTax);
        }
    }

    function _processSupply(
        TokenInfoParameters memory tokenParameters_,
        TokenLpInfo memory tokenLpInfo_
    ) internal virtual;

    /**
     * @dev Safeguard method to withdraw all the remaining eth to the project address
     *
     */
    function withdrawNative() external {
        _transferNative(address(this).balance, taxRecipient);
    }

    function withdrawERC20() external {
        this.transferFrom(
            address(this),
            taxRecipient,
            this.balanceOf(address(this))
        );
    }

    function _transferNative(
        uint256 amount,
        address to
    ) internal returns (bool) {
        uint256 gas = (CALL_GAS_LIMIT == 0 || CALL_GAS_LIMIT > gasleft())
            ? gasleft()
            : CALL_GAS_LIMIT;
        (bool success, ) = to.call{value: amount, gas: gas}("");
        return success;
    }

    function toggleConversion() external onlyOwner {
        autoConversion = !autoConversion;
    }

    /**
     * @dev Function to change the buy and sell tax for marketing
     * @param newBuyTax_ New buy tax in per thousand
     * @param newSellTax_ New sell tax in per thousand
     */
    function changeTaxes(
        uint256 newBuyTax_,
        uint256 newSellTax_,
        uint256 newBuyLPTax_,
        uint256 newSellLPTax_
    ) external onlyOwner {

        uint16 oldBuyTax = buyTax;
        uint16 oldSellTax = sellTax;
        buyTax = uint16(newBuyTax_);
        sellTax = uint16(newSellTax_);

        _hasTax = buyTax > 0 && sellTax > 0;

        emit TaxChanged(oldBuyTax, oldSellTax, buyTax, sellTax);

        oldBuyTax = buyLPTax;
        oldSellTax = sellLPTax;
        buyLPTax = uint16(newBuyLPTax_);
        sellLPTax = uint16(newSellLPTax_);

        _hasLPTax = buyLPTax > 0 && sellLPTax > 0;

        emit LPTaxChanged(oldBuyTax, oldSellTax, buyLPTax, sellLPTax);
    }

    function _safeGuardTransfer(
        address from_,
        address to_,
        uint256 amount_
    ) internal view virtual {
        uint256 fromBalance = _balances[from_];

        if (fromBalance < amount_) {
            _revert(NotEnoughBalance.selector);
        }
        if (
            buyMaxTx > 0 &&
            from_ == pairAddress &&
            !_excludedFromLimits.contains(to_) &&
            amount_ > buyMaxTx
        ) {
            _revert(TransactionIsTooBig.selector);
        }
        if (
            sellMaxTx > 0 &&
            to_ == pairAddress &&
            !_excludedFromLimits.contains(from_) &&
            amount_ > sellMaxTx
        ) {
            _revert(TransactionIsTooBig.selector);
        }
        uint256 toBalance = _balances[to_];
        if (
            maxWallet > 0 &&
            maxWallet < toBalance + amount_ &&
            !_excludedFromLimits.contains(to_)
        ) {
            _revert(MaxWalletExceeded.selector);
        }
    }

    function changeTransactionHardCaps(
        uint256 newBuyMaxTx_,
        uint256 newSellMaxTx_,
        uint256 newMaxWallet_
    ) external onlyOwner {
        if (
            newBuyMaxTx_ < buyMaxTx ||
            newSellMaxTx_ < sellMaxTx ||
            newMaxWallet_ < maxWallet
        ) {
            _revert(LimitsLoweringIsNotAllowed.selector);
        }
        uint128 oldMaxWallet = maxWallet;
        uint128 oldMaxSellTx = sellMaxTx;
        uint128 oldMaxBuyTx = buyMaxTx;
        buyMaxTx = uint128(newBuyMaxTx_);
        sellMaxTx = uint128(newSellMaxTx_);
        maxWallet = uint128(newMaxWallet_);

        emit LimitsRaised(
            oldMaxBuyTx,
            oldMaxSellTx,
            oldMaxWallet,
            buyMaxTx,
            sellMaxTx,
            maxWallet
        );
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _safeGuardAllowance(
        address owner_,
        address spender_,
        uint256 amount_
    ) internal virtual {
        uint256 currentAllowance = this.allowance(owner_, spender_);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < amount_) {
                _revert(InsufficientAllowance.selector);
            }

            unchecked {
                _approve(owner_, spender_, currentAllowance - amount_);
            }
        }
    }

    receive() external payable {}


    function _swapTaxes(address from_, address to_) internal {
        if (_shouldApplyTax() && autoConversion) {
            uint256 swapBalance = accumulatedTax +
                        starShipAccumulatedTax +
                        lpAccumulatedTax;

            uint256 swapThresholdInTokens = (_totalSupply * pctForSwap) / 1000;
            if (
                swapBalance >= swapThresholdInTokens &&
                !_IsInConversion &&
                from_ != pairAddress &&
                from_ != address(_uniswapRouter) &&
                to_ != address(_uniswapRouter)
            ) {
                _IsInConversion = true;
                if (
                    swapBalance >
                    swapThresholdInTokens * MAX_SWAP_THRESHOLD_MULTIPLE
                ) {
                    swapBalance =
                        swapThresholdInTokens *
                        MAX_SWAP_THRESHOLD_MULTIPLE;
                }
                // Perform the auto swap to native token:
                _doSwap(swapBalance, this.balanceOf(address(this)));

                // Flag that the autoswap is complete:
                _IsInConversion = false;
            }
        }
    }

    function _doSwap(uint256 swapBalance_, uint256 contractBalance_) internal {
        uint256 preSwapNativeBalance = address(this).balance;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapRouter.WETH();
        uint256 lpTokensProportion = 0;
        if (swapBalance_ < contractBalance_) {
            lpTokensProportion =
                (swapBalance_ * lpAccumulatedTax) /
                contractBalance_;
        } else {
            lpTokensProportion = lpAccumulatedTax;
        }

        // Wrap external calls in try / catch to handle errors
        try
        _uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            swapBalance_ - (lpTokensProportion / 2),
            0,
            path,
            address(this),
            block.timestamp + 600
        )
        {

            uint256 postSwapBalance = address(this).balance;
            uint256 lpTokens = (lpTokensProportion / 2);
            uint256 totalPendingSwap = accumulatedTax +
                        starShipAccumulatedTax +
                        lpTokens;
            uint256 balanceToDistribute = postSwapBalance -
                        preSwapNativeBalance;
            uint256 projectBalanceToDistribute = (balanceToDistribute *
                accumulatedTax) / totalPendingSwap;
            uint256 starShipBalance = (balanceToDistribute *
                starShipAccumulatedTax) / totalPendingSwap;

            uint256 lpBalance = (balanceToDistribute * lpTokens) /
                        totalPendingSwap;

            if (swapBalance_ < contractBalance_) {
                accumulatedTax -= uint128(
                    (accumulatedTax * swapBalance_) / contractBalance_
                );
                starShipAccumulatedTax -= uint128(
                    (starShipAccumulatedTax * swapBalance_) / contractBalance_
                );

                lpAccumulatedTax -= uint128(
                    (lpAccumulatedTax * swapBalance_) / contractBalance_
                );

            } else {
                (accumulatedTax, starShipAccumulatedTax, lpAccumulatedTax) = (
                    0,
                    0,
                    0
                );
            }
            if (_hasLPTax) {
                try
                _uniswapRouter.addLiquidityETH{value: lpBalance}(
                    address(this),
                    lpTokens,
                    0, // slippage is unavoidable
                    0, // slippage is unavoidable
                    owner(),
                    block.timestamp
                )
                {
                    emit LiquiditySupplied(lpTokens, lpBalance);
                } catch {

                }
            }

            // Distribute to treasuries:
            bool success;
            uint256 gas;
            if (projectBalanceToDistribute > 0) {
                _transferNative(projectBalanceToDistribute, taxRecipient);
            }

            if (starShipBalance > 0) {
                _transferNative(starShipBalance, startShipVault);
            }
        } catch {
            // Dont allow a failed external call (in this case to uniswap) to stop a transfer.
            // Emit that this has occured and continue.
            emit ExternalCallError(5);
        }
    }
}


contract StarBaseNoLockerERC20 is StarBaseAbstractERC20 {
    constructor(
        address[5] memory addresses,
        bytes memory tokenInfo,
        bytes memory taxesInfo,
        bytes memory lpInfo
    ) StarBaseAbstractERC20(addresses, tokenInfo, taxesInfo, lpInfo) {
        autoConversion = true;
    }

    /**
     * This will mint the balances for the liquidity pool, which will be minted to the
     * contract and the rest will be minted to the caller. Also, transaction will revert
     * if less than 25% of the tokens are not designated to the liquidity pool.
     *
     * @param tokenParameters Token info parameters where the total supply is
     * @param tokenLpInfo The information about the liquidity pool
     */
    function _processSupply(
        TokenInfoParameters memory tokenParameters,
        TokenLpInfo memory tokenLpInfo
    ) internal override {
        _mint(owner(), tokenParameters.maxSupply);
    }

    function addLiquidity() external payable override returns (address) {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[5]","name":"addresses","type":"address[5]"},{"internalType":"bytes","name":"tokenInfo","type":"bytes"},{"internalType":"bytes","name":"taxesInfo","type":"bytes"},{"internalType":"bytes","name":"lpInfo","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApproveFromTheZeroAddress","type":"error"},{"inputs":[],"name":"ApproveToTheZeroAddress","type":"error"},{"inputs":[],"name":"BurnExceedsBalance","type":"error"},{"inputs":[],"name":"BurnFromTheZeroAddress","type":"error"},{"inputs":[],"name":"CallerIsNotTheOwner","type":"error"},{"inputs":[],"name":"CannotSetNewOwnerToTheZeroAddress","type":"error"},{"inputs":[],"name":"HardCapIsTooHigh","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"LPAlreadyCreated","type":"error"},{"inputs":[],"name":"LPNotInit","type":"error"},{"inputs":[],"name":"LimitsLoweringIsNotAllowed","type":"error"},{"inputs":[],"name":"LpTokensExceedsTotalSupply","type":"error"},{"inputs":[],"name":"MaxWalletExceeded","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"NotEnoughBalance","type":"error"},{"inputs":[],"name":"NotEnoughFundsForLP","type":"error"},{"inputs":[],"name":"OperationNotAllowed","type":"error"},{"inputs":[],"name":"TaxesCanNotBeRaised","type":"error"},{"inputs":[],"name":"TooFewLPTokens","type":"error"},{"inputs":[],"name":"TransactionIsTooBig","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"ExternalCallError","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousSellTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"LPTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"oldBuyLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"oldSellLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"oldMaxWallet","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newBuyLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newSellLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newMaxWallet","type":"uint128"}],"name":"LimitsRaised","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSupplied","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethSupplied","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokensIssued","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityBurned","type":"uint256"}],"name":"LiquidityBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lpTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daysLocked","type":"uint256"}],"name":"LiquidityLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eth","type":"uint256"}],"name":"LiquiditySupplied","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":"previousBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousSellTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"TaxChanged","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":[],"name":"accumulatedTax","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLPTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMaxTx","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyTax_","type":"uint256"},{"internalType":"uint256","name":"newSellTax_","type":"uint256"},{"internalType":"uint256","name":"newBuyLPTax_","type":"uint256"},{"internalType":"uint256","name":"newSellLPTax_","type":"uint256"}],"name":"changeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyMaxTx_","type":"uint256"},{"internalType":"uint256","name":"newSellMaxTx_","type":"uint256"},{"internalType":"uint256","name":"newMaxWallet_","type":"uint256"}],"name":"changeTransactionHardCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialLiquidityFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLockedInDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockFee","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpAccumulatedTax","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpCreatedDate","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pctForSwap","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLPTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMaxTx","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shouldPayInTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starShipAccumulatedTax","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starShipTaxPoints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startShipVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensThreshHoldForSwap","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"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":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"x_ID_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600a805461ffff60881b1916600560881b1790553480156200002557600080fd5b506040516200323b3803806200323b83398101604081905262000048916200098c565b83838383620000573362000461565b600b805461ffff60b01b1916600560b01b17905583516200007890620004b1565b6020808501516001600160a01b0390811660809081526060870151821660a0528601511660c0528351600091620000b6918601810190860162000a89565b8051909150600690620000ca908262000c13565b506020810151600790620000df908262000c13565b5060c0810151600a8054911515600160981b0260ff60981b19909216919091179055600c80546001600160801b031981166001600160801b039182161790915560a082015111156200013d576200013d630805e55f60e11b620004ea565b60a0810151601180546001600160801b0319166001600160801b0390921691909117905582516000906200017b906020908601810190860162000cdf565b90506200018881620004f4565b60c0810151600580546001600160a01b0319166001600160a01b039092169190911790558251600090620001c6906020908601810190860162000d6c565b9050620001d4838262000633565b6040810151600b8054911515600160a01b0260ff60a01b199092169190911790556060810151600c80546001600160801b03928316600160801b02908316179055608080830151600d556020830151600e8054919093166001600160801b03199190911617909155516200024b9060039062000659565b506080516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b3919062000dc8565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000303573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000329919062000dc8565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000377573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039d919062000dc8565b600b80546001600160a01b0319166001600160a01b03929092169182179055620003ca9060039062000659565b50620003d860033062000659565b50620003e76003600062000659565b5062000408620003ff6000546001600160a01b031690565b60039062000659565b5062000420306080516000196200067960201b60201c565b600b546200043c9030906001600160a01b031660001962000679565b5050600a805460ff60801b1916600160801b1790555062000e1c975050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620004bb6200071c565b6001600160a01b038116620004dc57620004dc6302c4fd4960e51b620004ea565b620004e78162000461565b50565b8060005260046000fd5b60a08101516001600160801b03108062000518575060808101516001600160801b03105b15620005305762000530630805e55f60e11b620004ea565b608081015160a08201516001600160801b03908116600160801b0291161760105580511580156200056357506020810151155b156200057c576008805460ff60801b19169055620005be565b6008805482516020840151600160801b62ffffff60801b19909316600160881b61ffff93841602179290921761ffff60981b1916600160981b91909216021790555b6040810151158015620005d357506060810151155b15620005e9576008805460ff60a81b1916905550565b600880546040830151606084015161ffff908116600160c01b0261ffff60c01b1991909216600160b01b0262ffffff60a81b1990931692909217600160a81b179190911617905550565b620006556200064a6000546001600160a01b031690565b606084015162000743565b5050565b600062000670836001600160a01b03841662000802565b90505b92915050565b6001600160a01b0383166200069a576200069a6356fdae6560e11b620004ea565b6001600160a01b038216620006bb57620006bb63b2fa1ef360e01b620004ea565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b03163314620007415762000741633e8be92f60e01b620004ea565b565b6001600160a01b038216620007635762000763622e076360e81b620004ea565b60088054829190600090620007839084906001600160801b031662000de6565b82546001600160801b039182166101009390930a9283029190920219909116179055506001600160a01b038216600081815260016020526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620007f69085815260200190565b60405180910390a35050565b60008181526001830160205260408120546200084b5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000673565b50600062000673565b505050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b038111828210171562000894576200089462000859565b60405290565b60405161010081016001600160401b038111828210171562000894576200089462000859565b80516001600160a01b0381168114620008d857600080fd5b919050565b600082601f830112620008ef57600080fd5b81516001600160401b03808211156200090c576200090c62000859565b604051601f8301601f19908116603f0116810190828211818310171562000937576200093762000859565b816040528381526020925086838588010111156200095457600080fd5b600091505b8382101562000978578582018301518183018401529082019062000959565b600093810190920192909252949350505050565b6000806000806101008587031215620009a457600080fd5b85601f860112620009b457600080fd5b620009be6200086f565b8060a0870188811115620009d157600080fd5b875b81811015620009f657620009e781620008c0565b845260209384019301620009d3565b505190955090506001600160401b038082111562000a1357600080fd5b62000a2188838901620008dd565b945060c087015191508082111562000a3857600080fd5b62000a4688838901620008dd565b935060e087015191508082111562000a5d57600080fd5b5062000a6c87828801620008dd565b91505092959194509250565b80518015158114620008d857600080fd5b60006020828403121562000a9c57600080fd5b81516001600160401b038082111562000ab457600080fd5b90830190610100828603121562000aca57600080fd5b62000ad46200089a565b82518281111562000ae457600080fd5b62000af287828601620008dd565b82525060208301518281111562000b0857600080fd5b62000b1687828601620008dd565b60208301525062000b2a6040840162000a78565b60408201526060830151606082015262000b4760808401620008c0565b608082015260a083015160a082015262000b6460c0840162000a78565b60c082015262000b7760e0840162000a78565b60e082015295945050505050565b600181811c9082168062000b9a57607f821691505b60208210810362000bbb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200085457600081815260208120601f850160051c8101602086101562000bea5750805b601f850160051c820191505b8181101562000c0b5782815560010162000bf6565b505050505050565b81516001600160401b0381111562000c2f5762000c2f62000859565b62000c478162000c40845462000b85565b8462000bc1565b602080601f83116001811462000c7f576000841562000c665750858301515b600019600386901b1c1916600185901b17855562000c0b565b600085815260208120601f198616915b8281101562000cb05788860151825594840194600190910190840162000c8f565b508582101562000ccf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060e0828403121562000cf257600080fd5b60405160e081016001600160401b038111828210171562000d175762000d1762000859565b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015262000d6060c08401620008c0565b60c08201529392505050565b600060a0828403121562000d7f57600080fd5b62000d896200086f565b825181526020830151602082015262000da56040840162000a78565b604082015260608301516060820152608083015160808201528091505092915050565b60006020828403121562000ddb57600080fd5b6200067082620008c0565b6001600160801b0381811683821601908082111562000e1557634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a05160c0516123cc62000e6f600039600081816107380152611f67015260006106930152600081816118460152818161188401528181611a2a01528181611b280152611e2d01526123cc6000f3fe6080604052600436106102765760003560e01c806395d89b411161014f578063d851e102116100c1578063f2fde38b1161007a578063f2fde38b1461081e578063f466a7371461083e578063f8b45b0514610853578063f9c0a3c314610873578063fc9b15e314610893578063fd935c4c146108b557600080fd5b8063d851e10214610726578063da942cbf1461075a578063db7321e11461077b578063dd62ed3e146107af578063e6d20a43146107f5578063e8078d941461081757600080fd5b8063a9059cbb11610113578063a9059cbb1461063a578063ba4f247c1461065a578063c45a015514610681578063c72172fd146106b5578063cc1776d3146106ee578063ce0617ec1461071057600080fd5b806395d89b41146105a557806395f535c9146105ba578063a063d44e146105da578063a6d3bb67146105fa578063a8b089821461061a57600080fd5b80634824167b116101e857806370a08231116101ac57806370a08231146104c3578063715018a6146104f9578063737ea06e1461050e5780637b9906b7146105465780638da5cb5b14610566578063938b3aeb1461058457600080fd5b80634824167b146104245780634f7041a51461044457806350431ce41461046657806356a062351461047b5780636bc357bf146104a257600080fd5b806323b872dd1161023a57806323b872dd1461035057806325172038146103705780632ed6d5e814610392578063313ce567146103a957806342966c68146103c5578063474465e0146103e557600080fd5b806306fdde0314610282578063091f3b6e146102ad578063095ea7b3146102e257806318160ddd146103125780631dafcff11461033a57600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102976108d5565b6040516102a49190611f9d565b60405180910390f35b3480156102b957600080fd5b50600b546102cf90600160b01b900461ffff1681565b60405161ffff90911681526020016102a4565b3480156102ee57600080fd5b506103026102fd366004612000565b610967565b60405190151581526020016102a4565b34801561031e57600080fd5b506008546001600160801b03165b6040519081526020016102a4565b34801561034657600080fd5b5061032c600d5481565b34801561035c57600080fd5b5061030261036b36600461202c565b610981565b34801561037c57600080fd5b506008546102cf90600160b01b900461ffff1681565b34801561039e57600080fd5b506103a76109a1565b005b3480156103b557600080fd5b50604051601281526020016102a4565b3480156103d157600080fd5b506103a76103e036600461206d565b610a93565b3480156103f157600080fd5b5060095461040c90600160801b90046001600160801b031681565b6040516001600160801b0390911681526020016102a4565b34801561043057600080fd5b50600c5461040c906001600160801b031681565b34801561045057600080fd5b506008546102cf90600160881b900461ffff1681565b34801561047257600080fd5b506103a7610a9d565b34801561048757600080fd5b50600c5461040c90600160801b90046001600160801b031681565b3480156104ae57600080fd5b50600a5461030290600160801b900460ff1681565b3480156104cf57600080fd5b5061032c6104de366004612086565b6001600160a01b031660009081526001602052604090205490565b34801561050557600080fd5b506103a7610ab4565b34801561051a57600080fd5b5060055461052e906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561055257600080fd5b506103a76105613660046120a3565b610ac8565b34801561057257600080fd5b506000546001600160a01b031661052e565b34801561059057600080fd5b50600a5461030290600160981b900460ff1681565b3480156105b157600080fd5b50610297610bd0565b3480156105c657600080fd5b50600e5461040c906001600160801b031681565b3480156105e657600080fd5b506103a76105f53660046120cf565b610bdf565b34801561060657600080fd5b50600a5461040c906001600160801b031681565b34801561062657600080fd5b50600b5461052e906001600160a01b031681565b34801561064657600080fd5b50610302610655366004612000565b610da0565b34801561066657600080fd5b5060105461040c90600160801b90046001600160801b031681565b34801561068d57600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c157600080fd5b50600a546106d990600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016102a4565b3480156106fa57600080fd5b506008546102cf90600160981b900461ffff1681565b34801561071c57600080fd5b5061032c600f5481565b34801561073257600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561076657600080fd5b50600b5461030290600160a01b900460ff1681565b34801561078757600080fd5b5061032c7fb07887f9e6857c947639357c810260e93a866b112197fa793b96ffe10082a24481565b3480156107bb57600080fd5b5061032c6107ca366004612101565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561080157600080fd5b506008546102cf90600160c01b900461ffff1681565b600061052e565b34801561082a57600080fd5b506103a7610839366004612086565b610db4565b34801561084a57600080fd5b506103a7610de3565b34801561085f57600080fd5b5060115461040c906001600160801b031681565b34801561087f57600080fd5b5060095461040c906001600160801b031681565b34801561089f57600080fd5b50600a546102cf90600160881b900461ffff1681565b3480156108c157600080fd5b5060105461040c906001600160801b031681565b6060600680546108e49061213a565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061213a565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b600033610975818585610e0c565b60019150505b92915050565b600061098e843384610eaa565b610999848484610f53565b949350505050565b6005546040516370a0823160e01b81523060048201819052916323b872dd9183916001600160a01b03169082906370a0823190602401602060405180830381865afa1580156109f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a189190612174565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a90919061218d565b50565b610a903382610ff5565b600554610a909047906001600160a01b03166110b7565b610abc611130565b610ac66000611152565b565b610ad0611130565b6010546001600160801b0316831080610afa5750601054600160801b90046001600160801b031682105b80610b0f57506011546001600160801b031681105b15610b2457610b246375ff525b60e01b6111a2565b60118054601080546001600160801b03878116600160801b8883168102828117958690556001600160801b03198716898516908117909855604080518587168082529684900486166020820181905298861691810182905291851690931760608201529404909116608084015260a0830194909452907f9da282dae9508ab66f11209ef1f9e7bbe0728ad3f06f7ba8783fc13d1e6d388a9060c0015b60405180910390a1505050505050565b6060600780546108e49061213a565b610be7611130565b6008805463ffffffff60881b198116600160881b61ffff888116820261ffff60981b191692909217600160981b888416810291909117948590558184048316949304821692041615801590610c485750600854600160981b900461ffff1615155b6008805460ff60801b1916600160801b9215159290920291909117908190556040805161ffff85811682528481166020830152600160881b8404811682840152600160981b9093049092166060830152517f996af4dde4d067a946811671989668032cdbe3f94e5f2352530dba72da86b8759181900360800190a150506008805463ffffffff60b01b198116600160b01b61ffff868116820261ffff60c01b191692909217600160c01b868416810291909117948590558184048316949304821692041615801590610d265750600854600160c01b900461ffff1615155b60088054911515600160a81b0260ff60a81b1990921691909117908190556040805161ffff85811682528481166020830152600160b01b8404811692820192909252600160c01b9092041660608201527fdbe9f29542588ba3c52d9a210036ea7fa83d5c8812d999342fe46fc2f3fce89990608001610bc0565b6000610dad338484610f53565b9392505050565b610dbc611130565b6001600160a01b038116610dda57610dda6302c4fd4960e51b6111a2565b610a9081611152565b610deb611130565b600a805460ff60801b198116600160801b9182900460ff1615909102179055565b6001600160a01b038316610e2a57610e2a6356fdae6560e11b6111a2565b6001600160a01b038216610e4857610e4863b2fa1ef360e01b6111a2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b604051636eb1769f60e11b81526001600160a01b03808516600483015283166024820152600090309063dd62ed3e90604401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190612174565b90506000198114610f4d5781811015610f4057610f406313be252b60e01b6111a2565b610f4d8484848403610e0c565b50505050565b6000610f608484846111ac565b6000610f6d85858561132d565b9050610f79858561176e565b6001600160a01b038581166000818152600160209081526040808320805489900390559388168083529184902080546001600160801b038716908101909155935193845290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3506001949350505050565b6001600160a01b038216611013576110136304fca6bd60e41b6111a2565b6001600160a01b038216600090815260016020526040902054818110156110445761104463588569f760e01b6111a2565b6001600160a01b0383166000818152600160205260408082208585039055600880546001600160801b03808216889003166001600160801b0319909116179055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610e9d9086815260200190565b6000805a61c350116110cb5761c3506110cd565b5a5b90506000836001600160a01b0316858390604051600060405180830381858888f193505050503d806000811461111f576040519150601f19603f3d011682016040523d82523d6000602084013e611124565b606091505b50909695505050505050565b6000546001600160a01b03163314610ac657610ac6633e8be92f60e01b6111a2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8060005260046000fd5b6001600160a01b038316600090815260016020526040902054818110156111dd576111dd63569d45cf60e11b6111a2565b6010546001600160801b0316158015906112045750600b546001600160a01b038581169116145b80156112185750611216600384611970565b155b801561122e57506010546001600160801b031682115b1561124357611243631ca5a3cb60e21b6111a2565b601054600160801b90046001600160801b0316158015906112715750600b546001600160a01b038481169116145b80156112855750611283600385611970565b155b80156112a25750601054600160801b90046001600160801b031682115b156112b7576112b7631ca5a3cb60e21b6111a2565b6001600160a01b0383166000908152600160205260409020546011546001600160801b0316158015906112fd57506112ef83826121c5565b6011546001600160801b0316105b8015611311575061130f600385611970565b155b1561132657611326632ce93b5960e01b6111a2565b5050505050565b60008181808061133b611992565b80156113515750600b54600160a81b900460ff16155b1561174257600b546001600160a01b03898116911614801561137b5750611379600388611970565b155b156114e357600854600160881b900461ffff16156113bc576008546103e8906113af90600160881b900461ffff16866121d8565b6113b99190612219565b92505b600a54600160981b900460ff161561143f57600a546103e8906113ea90600160881b900461ffff16866121d8565b6113f49190612219565b915081600960108282829054906101000a90046001600160801b031661141a919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156114645750600854600160b01b900461ffff1615155b156114de576008546103e89061148590600160b01b900461ffff16866121d8565b61148f9190612219565b611499908261223f565b600a805491925082916000906114b99084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b61166b565b600b546001600160a01b0388811691161480156115085750611506600389611970565b155b1561166b57600854600160981b900461ffff1615611549576008546103e89061153c90600160981b900461ffff16866121d8565b6115469190612219565b92505b600a54600160981b900460ff16156115cc57600a546103e89061157790600160881b900461ffff16866121d8565b6115819190612219565b915081600960108282829054906101000a90046001600160801b03166115a7919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156115f15750600854600160c01b900461ffff1615155b1561166b576008546103e89061161290600160c01b900461ffff16866121d8565b61161c9190612219565b611626908261223f565b600a805491925082916000906116469084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6000836001600160801b0316118061168c57506000826001600160801b0316115b806116a057506000816001600160801b0316115b1561174257600980546001600160801b031981166001600160801b039182168601821617909155306000818152600160205260409020805485870185019093169092019091556001600160a01b0389167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8361171c868861223f565b611726919061223f565b6040516001600160801b03909116815260200160405180910390a35b808361174e8487612266565b6117589190612266565b6117629190612266565b98975050505050505050565b611776611992565b801561178b5750600a54600160801b900460ff165b1561196c57600a546009546000916001600160801b03908116916117b991600160801b82048116911661223f565b6117c3919061223f565b600b546008546001600160801b0392831693506000926103e8926117f492600160b01b90910461ffff1691166121d8565b6117fe9190612219565b6001600160801b031690508082101580156118235750600b54600160a81b900460ff16155b801561183d5750600b546001600160a01b03858116911614155b801561187b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614155b80156118b957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b15610f4d57600b805460ff60a81b1916600160a81b1790556118dc601482612286565b8211156118f1576118ee601482612286565b91505b6040516370a0823160e01b8152306004820181905261195c918491906370a0823190602401602060405180830381865afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190612174565b6119cf565b600b805460ff60a81b1916905550505b5050565b6001600160a01b03811660009081526001830160205260408120541515610dad565b600854600090600160801b900460ff16806119b65750600a54600160981b900460ff165b806119ca5750600854600160a81b900460ff165b905090565b604080516002808252606082018352479260009291906020830190803683370190505090503081600081518110611a0857611a0861229d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa91906122b3565b81600181518110611abd57611abd61229d565b60200260200101906001600160a01b031690816001600160a01b031681525050600083851015611b1057600a548490611aff906001600160801b031687612286565b611b0991906122d0565b9050611b1e565b50600a546001600160801b03165b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663791ac947611b586002846122d0565b611b6290886122e4565b60008530611b72426102586121c5565b6040518663ffffffff1660e01b8152600401611b929594939291906122f7565b600060405180830381600087803b158015611bac57600080fd5b505af1925050508015611bbd575060015b611bfa57604051600581527f60dc41faad9fe4f70f304dcef26d96d71e98ec8e21e4a340921d94dfe46307dc9060200160405180910390a1611326565b476000611c086002846122d0565b6009549091506000908290611c2f906001600160801b03600160801b82048116911661223f565b6001600160801b0316611c4291906121c5565b90506000611c5087856122e4565b6009549091506000908390611c6e906001600160801b031684612286565b611c7891906122d0565b6009549091506000908490611c9d90600160801b90046001600160801b031685612286565b611ca791906122d0565b9050600084611cb68786612286565b611cc091906122d0565b90508a8c1015611e03576009548b90611ce3908e906001600160801b0316612286565b611ced91906122d0565b60098054600090611d089084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508a8c600960109054906101000a90046001600160801b03166001600160801b0316611d579190612286565b611d6191906122d0565b60098054601090611d83908490600160801b90046001600160801b0316612266565b82546101009290920a6001600160801b03818102199093169183160217909155600a548d9250611db5918f9116612286565b611dbf91906122d0565b600a8054600090611dda9084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550611e19565b600a80546001600160801b031916905560006009555b600854600160a81b900460ff1615611f39577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d719823089600080611e726000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af193505050508015611ef7575060408051601f3d908101601f19168201909252611ef491810190612368565b60015b15611f3957505060408051888152602081018490527f3093137ef5ce18e5dc5e3d21ac966505edafb77edc1e264ae46d103a78c484a992500160405180910390a15b6000808415611f5b57600554611f599086906001600160a01b03166110b7565b505b8315611f8d57611f8b847f00000000000000000000000000000000000000000000000000000000000000006110b7565b505b5050505050505050505050505050565b600060208083528351808285015260005b81811015611fca57858101830151858201604001528201611fae565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a9057600080fd5b6000806040838503121561201357600080fd5b823561201e81611feb565b946020939093013593505050565b60008060006060848603121561204157600080fd5b833561204c81611feb565b9250602084013561205c81611feb565b929592945050506040919091013590565b60006020828403121561207f57600080fd5b5035919050565b60006020828403121561209857600080fd5b8135610dad81611feb565b6000806000606084860312156120b857600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156120e557600080fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561211457600080fd5b823561211f81611feb565b9150602083013561212f81611feb565b809150509250929050565b600181811c9082168061214e57607f821691505b60208210810361216e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561218657600080fd5b5051919050565b60006020828403121561219f57600080fd5b81518015158114610dad57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561097b5761097b6121af565b6001600160801b038181168382160280821691908281146121fb576121fb6121af565b505092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061223357612233612203565b92169190910492915050565b6001600160801b0381811683821601908082111561225f5761225f6121af565b5092915050565b6001600160801b0382811682821603908082111561225f5761225f6121af565b808202811582820484141761097b5761097b6121af565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156122c557600080fd5b8151610dad81611feb565b6000826122df576122df612203565b500490565b8181038181111561097b5761097b6121af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123475784516001600160a01b031683529383019391830191600101612322565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561237d57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207d3652429213c85fa3df0251001c99cf9e8dd35206cc62109869142ea61cc85964736f6c634300081500330000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000663a5c229c09b049e36dcc11a9b0d4a8eb9db2140000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea3230000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b133600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000001f

Deployed Bytecode

0x6080604052600436106102765760003560e01c806395d89b411161014f578063d851e102116100c1578063f2fde38b1161007a578063f2fde38b1461081e578063f466a7371461083e578063f8b45b0514610853578063f9c0a3c314610873578063fc9b15e314610893578063fd935c4c146108b557600080fd5b8063d851e10214610726578063da942cbf1461075a578063db7321e11461077b578063dd62ed3e146107af578063e6d20a43146107f5578063e8078d941461081757600080fd5b8063a9059cbb11610113578063a9059cbb1461063a578063ba4f247c1461065a578063c45a015514610681578063c72172fd146106b5578063cc1776d3146106ee578063ce0617ec1461071057600080fd5b806395d89b41146105a557806395f535c9146105ba578063a063d44e146105da578063a6d3bb67146105fa578063a8b089821461061a57600080fd5b80634824167b116101e857806370a08231116101ac57806370a08231146104c3578063715018a6146104f9578063737ea06e1461050e5780637b9906b7146105465780638da5cb5b14610566578063938b3aeb1461058457600080fd5b80634824167b146104245780634f7041a51461044457806350431ce41461046657806356a062351461047b5780636bc357bf146104a257600080fd5b806323b872dd1161023a57806323b872dd1461035057806325172038146103705780632ed6d5e814610392578063313ce567146103a957806342966c68146103c5578063474465e0146103e557600080fd5b806306fdde0314610282578063091f3b6e146102ad578063095ea7b3146102e257806318160ddd146103125780631dafcff11461033a57600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102976108d5565b6040516102a49190611f9d565b60405180910390f35b3480156102b957600080fd5b50600b546102cf90600160b01b900461ffff1681565b60405161ffff90911681526020016102a4565b3480156102ee57600080fd5b506103026102fd366004612000565b610967565b60405190151581526020016102a4565b34801561031e57600080fd5b506008546001600160801b03165b6040519081526020016102a4565b34801561034657600080fd5b5061032c600d5481565b34801561035c57600080fd5b5061030261036b36600461202c565b610981565b34801561037c57600080fd5b506008546102cf90600160b01b900461ffff1681565b34801561039e57600080fd5b506103a76109a1565b005b3480156103b557600080fd5b50604051601281526020016102a4565b3480156103d157600080fd5b506103a76103e036600461206d565b610a93565b3480156103f157600080fd5b5060095461040c90600160801b90046001600160801b031681565b6040516001600160801b0390911681526020016102a4565b34801561043057600080fd5b50600c5461040c906001600160801b031681565b34801561045057600080fd5b506008546102cf90600160881b900461ffff1681565b34801561047257600080fd5b506103a7610a9d565b34801561048757600080fd5b50600c5461040c90600160801b90046001600160801b031681565b3480156104ae57600080fd5b50600a5461030290600160801b900460ff1681565b3480156104cf57600080fd5b5061032c6104de366004612086565b6001600160a01b031660009081526001602052604090205490565b34801561050557600080fd5b506103a7610ab4565b34801561051a57600080fd5b5060055461052e906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561055257600080fd5b506103a76105613660046120a3565b610ac8565b34801561057257600080fd5b506000546001600160a01b031661052e565b34801561059057600080fd5b50600a5461030290600160981b900460ff1681565b3480156105b157600080fd5b50610297610bd0565b3480156105c657600080fd5b50600e5461040c906001600160801b031681565b3480156105e657600080fd5b506103a76105f53660046120cf565b610bdf565b34801561060657600080fd5b50600a5461040c906001600160801b031681565b34801561062657600080fd5b50600b5461052e906001600160a01b031681565b34801561064657600080fd5b50610302610655366004612000565b610da0565b34801561066657600080fd5b5060105461040c90600160801b90046001600160801b031681565b34801561068d57600080fd5b5061052e7f0000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea32381565b3480156106c157600080fd5b50600a546106d990600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016102a4565b3480156106fa57600080fd5b506008546102cf90600160981b900461ffff1681565b34801561071c57600080fd5b5061032c600f5481565b34801561073257600080fd5b5061052e7f0000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e81565b34801561076657600080fd5b50600b5461030290600160a01b900460ff1681565b34801561078757600080fd5b5061032c7fb07887f9e6857c947639357c810260e93a866b112197fa793b96ffe10082a24481565b3480156107bb57600080fd5b5061032c6107ca366004612101565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561080157600080fd5b506008546102cf90600160c01b900461ffff1681565b600061052e565b34801561082a57600080fd5b506103a7610839366004612086565b610db4565b34801561084a57600080fd5b506103a7610de3565b34801561085f57600080fd5b5060115461040c906001600160801b031681565b34801561087f57600080fd5b5060095461040c906001600160801b031681565b34801561089f57600080fd5b50600a546102cf90600160881b900461ffff1681565b3480156108c157600080fd5b5060105461040c906001600160801b031681565b6060600680546108e49061213a565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061213a565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b600033610975818585610e0c565b60019150505b92915050565b600061098e843384610eaa565b610999848484610f53565b949350505050565b6005546040516370a0823160e01b81523060048201819052916323b872dd9183916001600160a01b03169082906370a0823190602401602060405180830381865afa1580156109f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a189190612174565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a90919061218d565b50565b610a903382610ff5565b600554610a909047906001600160a01b03166110b7565b610abc611130565b610ac66000611152565b565b610ad0611130565b6010546001600160801b0316831080610afa5750601054600160801b90046001600160801b031682105b80610b0f57506011546001600160801b031681105b15610b2457610b246375ff525b60e01b6111a2565b60118054601080546001600160801b03878116600160801b8883168102828117958690556001600160801b03198716898516908117909855604080518587168082529684900486166020820181905298861691810182905291851690931760608201529404909116608084015260a0830194909452907f9da282dae9508ab66f11209ef1f9e7bbe0728ad3f06f7ba8783fc13d1e6d388a9060c0015b60405180910390a1505050505050565b6060600780546108e49061213a565b610be7611130565b6008805463ffffffff60881b198116600160881b61ffff888116820261ffff60981b191692909217600160981b888416810291909117948590558184048316949304821692041615801590610c485750600854600160981b900461ffff1615155b6008805460ff60801b1916600160801b9215159290920291909117908190556040805161ffff85811682528481166020830152600160881b8404811682840152600160981b9093049092166060830152517f996af4dde4d067a946811671989668032cdbe3f94e5f2352530dba72da86b8759181900360800190a150506008805463ffffffff60b01b198116600160b01b61ffff868116820261ffff60c01b191692909217600160c01b868416810291909117948590558184048316949304821692041615801590610d265750600854600160c01b900461ffff1615155b60088054911515600160a81b0260ff60a81b1990921691909117908190556040805161ffff85811682528481166020830152600160b01b8404811692820192909252600160c01b9092041660608201527fdbe9f29542588ba3c52d9a210036ea7fa83d5c8812d999342fe46fc2f3fce89990608001610bc0565b6000610dad338484610f53565b9392505050565b610dbc611130565b6001600160a01b038116610dda57610dda6302c4fd4960e51b6111a2565b610a9081611152565b610deb611130565b600a805460ff60801b198116600160801b9182900460ff1615909102179055565b6001600160a01b038316610e2a57610e2a6356fdae6560e11b6111a2565b6001600160a01b038216610e4857610e4863b2fa1ef360e01b6111a2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b604051636eb1769f60e11b81526001600160a01b03808516600483015283166024820152600090309063dd62ed3e90604401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190612174565b90506000198114610f4d5781811015610f4057610f406313be252b60e01b6111a2565b610f4d8484848403610e0c565b50505050565b6000610f608484846111ac565b6000610f6d85858561132d565b9050610f79858561176e565b6001600160a01b038581166000818152600160209081526040808320805489900390559388168083529184902080546001600160801b038716908101909155935193845290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3506001949350505050565b6001600160a01b038216611013576110136304fca6bd60e41b6111a2565b6001600160a01b038216600090815260016020526040902054818110156110445761104463588569f760e01b6111a2565b6001600160a01b0383166000818152600160205260408082208585039055600880546001600160801b03808216889003166001600160801b0319909116179055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610e9d9086815260200190565b6000805a61c350116110cb5761c3506110cd565b5a5b90506000836001600160a01b0316858390604051600060405180830381858888f193505050503d806000811461111f576040519150601f19603f3d011682016040523d82523d6000602084013e611124565b606091505b50909695505050505050565b6000546001600160a01b03163314610ac657610ac6633e8be92f60e01b6111a2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8060005260046000fd5b6001600160a01b038316600090815260016020526040902054818110156111dd576111dd63569d45cf60e11b6111a2565b6010546001600160801b0316158015906112045750600b546001600160a01b038581169116145b80156112185750611216600384611970565b155b801561122e57506010546001600160801b031682115b1561124357611243631ca5a3cb60e21b6111a2565b601054600160801b90046001600160801b0316158015906112715750600b546001600160a01b038481169116145b80156112855750611283600385611970565b155b80156112a25750601054600160801b90046001600160801b031682115b156112b7576112b7631ca5a3cb60e21b6111a2565b6001600160a01b0383166000908152600160205260409020546011546001600160801b0316158015906112fd57506112ef83826121c5565b6011546001600160801b0316105b8015611311575061130f600385611970565b155b1561132657611326632ce93b5960e01b6111a2565b5050505050565b60008181808061133b611992565b80156113515750600b54600160a81b900460ff16155b1561174257600b546001600160a01b03898116911614801561137b5750611379600388611970565b155b156114e357600854600160881b900461ffff16156113bc576008546103e8906113af90600160881b900461ffff16866121d8565b6113b99190612219565b92505b600a54600160981b900460ff161561143f57600a546103e8906113ea90600160881b900461ffff16866121d8565b6113f49190612219565b915081600960108282829054906101000a90046001600160801b031661141a919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156114645750600854600160b01b900461ffff1615155b156114de576008546103e89061148590600160b01b900461ffff16866121d8565b61148f9190612219565b611499908261223f565b600a805491925082916000906114b99084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b61166b565b600b546001600160a01b0388811691161480156115085750611506600389611970565b155b1561166b57600854600160981b900461ffff1615611549576008546103e89061153c90600160981b900461ffff16866121d8565b6115469190612219565b92505b600a54600160981b900460ff16156115cc57600a546103e89061157790600160881b900461ffff16866121d8565b6115819190612219565b915081600960108282829054906101000a90046001600160801b03166115a7919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156115f15750600854600160c01b900461ffff1615155b1561166b576008546103e89061161290600160c01b900461ffff16866121d8565b61161c9190612219565b611626908261223f565b600a805491925082916000906116469084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6000836001600160801b0316118061168c57506000826001600160801b0316115b806116a057506000816001600160801b0316115b1561174257600980546001600160801b031981166001600160801b039182168601821617909155306000818152600160205260409020805485870185019093169092019091556001600160a01b0389167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8361171c868861223f565b611726919061223f565b6040516001600160801b03909116815260200160405180910390a35b808361174e8487612266565b6117589190612266565b6117629190612266565b98975050505050505050565b611776611992565b801561178b5750600a54600160801b900460ff165b1561196c57600a546009546000916001600160801b03908116916117b991600160801b82048116911661223f565b6117c3919061223f565b600b546008546001600160801b0392831693506000926103e8926117f492600160b01b90910461ffff1691166121d8565b6117fe9190612219565b6001600160801b031690508082101580156118235750600b54600160a81b900460ff16155b801561183d5750600b546001600160a01b03858116911614155b801561187b57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b031614155b80156118b957507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b031614155b15610f4d57600b805460ff60a81b1916600160a81b1790556118dc601482612286565b8211156118f1576118ee601482612286565b91505b6040516370a0823160e01b8152306004820181905261195c918491906370a0823190602401602060405180830381865afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190612174565b6119cf565b600b805460ff60a81b1916905550505b5050565b6001600160a01b03811660009081526001830160205260408120541515610dad565b600854600090600160801b900460ff16806119b65750600a54600160981b900460ff165b806119ca5750600854600160a81b900460ff165b905090565b604080516002808252606082018352479260009291906020830190803683370190505090503081600081518110611a0857611a0861229d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa91906122b3565b81600181518110611abd57611abd61229d565b60200260200101906001600160a01b031690816001600160a01b031681525050600083851015611b1057600a548490611aff906001600160801b031687612286565b611b0991906122d0565b9050611b1e565b50600a546001600160801b03165b6001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663791ac947611b586002846122d0565b611b6290886122e4565b60008530611b72426102586121c5565b6040518663ffffffff1660e01b8152600401611b929594939291906122f7565b600060405180830381600087803b158015611bac57600080fd5b505af1925050508015611bbd575060015b611bfa57604051600581527f60dc41faad9fe4f70f304dcef26d96d71e98ec8e21e4a340921d94dfe46307dc9060200160405180910390a1611326565b476000611c086002846122d0565b6009549091506000908290611c2f906001600160801b03600160801b82048116911661223f565b6001600160801b0316611c4291906121c5565b90506000611c5087856122e4565b6009549091506000908390611c6e906001600160801b031684612286565b611c7891906122d0565b6009549091506000908490611c9d90600160801b90046001600160801b031685612286565b611ca791906122d0565b9050600084611cb68786612286565b611cc091906122d0565b90508a8c1015611e03576009548b90611ce3908e906001600160801b0316612286565b611ced91906122d0565b60098054600090611d089084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508a8c600960109054906101000a90046001600160801b03166001600160801b0316611d579190612286565b611d6191906122d0565b60098054601090611d83908490600160801b90046001600160801b0316612266565b82546101009290920a6001600160801b03818102199093169183160217909155600a548d9250611db5918f9116612286565b611dbf91906122d0565b600a8054600090611dda9084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550611e19565b600a80546001600160801b031916905560006009555b600854600160a81b900460ff1615611f39577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d719823089600080611e726000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af193505050508015611ef7575060408051601f3d908101601f19168201909252611ef491810190612368565b60015b15611f3957505060408051888152602081018490527f3093137ef5ce18e5dc5e3d21ac966505edafb77edc1e264ae46d103a78c484a992500160405180910390a15b6000808415611f5b57600554611f599086906001600160a01b03166110b7565b505b8315611f8d57611f8b847f0000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e6110b7565b505b5050505050505050505050505050565b600060208083528351808285015260005b81811015611fca57858101830151858201604001528201611fae565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a9057600080fd5b6000806040838503121561201357600080fd5b823561201e81611feb565b946020939093013593505050565b60008060006060848603121561204157600080fd5b833561204c81611feb565b9250602084013561205c81611feb565b929592945050506040919091013590565b60006020828403121561207f57600080fd5b5035919050565b60006020828403121561209857600080fd5b8135610dad81611feb565b6000806000606084860312156120b857600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156120e557600080fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561211457600080fd5b823561211f81611feb565b9150602083013561212f81611feb565b809150509250929050565b600181811c9082168061214e57607f821691505b60208210810361216e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561218657600080fd5b5051919050565b60006020828403121561219f57600080fd5b81518015158114610dad57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561097b5761097b6121af565b6001600160801b038181168382160280821691908281146121fb576121fb6121af565b505092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061223357612233612203565b92169190910492915050565b6001600160801b0381811683821601908082111561225f5761225f6121af565b5092915050565b6001600160801b0382811682821603908082111561225f5761225f6121af565b808202811582820484141761097b5761097b6121af565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156122c557600080fd5b8151610dad81611feb565b6000826122df576122df612203565b500490565b8181038181111561097b5761097b6121af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123475784516001600160a01b031683529383019391830191600101612322565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561237d57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207d3652429213c85fa3df0251001c99cf9e8dd35206cc62109869142ea61cc85964736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000663a5c229c09b049e36dcc11a9b0d4a8eb9db2140000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea3230000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b133600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000001f

-----Decoded View---------------
Arg [0] : addresses (address[5]): 0x3b3F01373270b6f70FA815ec1Cc121271B5b1336,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0x663A5C229c09b049E36dCc11a9B0d4a8Eb9db214,0x7ce6A5b0513eFc73D15dC4809b4bc51e76aeA323,0x2a384fD9e2f27621A0b80D12974Dd2AcEb250e2E
Arg [1] : tokenInfo (bytes): 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d43474100000000000000000000000000000000000000000000000000000000
Arg [2] : taxesInfo (bytes): 0x000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [3] : lpInfo (bytes): 0x000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000001f

-----Encoded View---------------
36 Constructor Arguments found :
Arg [0] : 0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000663a5c229c09b049e36dcc11a9b0d4a8eb9db214
Arg [3] : 0000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea323
Arg [4] : 0000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [6] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [14] : 0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [15] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 4d43474100000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [21] : 4d43474100000000000000000000000000000000000000000000000000000000
Arg [22] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [24] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [25] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [26] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [27] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [28] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [29] : 0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [30] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [31] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [32] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [34] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [35] : 000000000000000000000000000000000000000000000000000000000000001f


Loading...
Loading
Loading...
Loading
[ 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.