StandardToken

Description:

Multi-signature wallet contract requiring multiple confirmations for transaction execution.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "contracts/StandardTokens/StandardToken.sol": {
      "content": "// SPDX-License-Identifier: MIT\r
\r
pragma solidity ^0.8.1;\r
\r
library Address {\r
    function isContract(address account) internal view returns (bool) {\r
        // This method relies on extcodesize/address.code.length, which returns 0\r
        // for contracts in construction, since the code is only stored at the end\r
        // of the constructor execution.\r
\r
        return account.code.length > 0;\r
    }\r
    function sendValue(address payable recipient, uint256 amount) internal {\r
        require(address(this).balance >= amount, "Address: insufficient balance");\r
\r
        (bool success, ) = recipient.call{value: amount}("");\r
        require(success, "Address: unable to send value, recipient may have reverted");\r
    }\r
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\r
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");\r
    }\r
    function functionCall(\r
        address target,\r
        bytes memory data,\r
        string memory errorMessage\r
    ) internal returns (bytes memory) {\r
        return functionCallWithValue(target, data, 0, errorMessage);\r
    }\r
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\r
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");\r
    }\r
    function functionCallWithValue(\r
        address target,\r
        bytes memory data,\r
        uint256 value,\r
        string memory errorMessage\r
    ) internal returns (bytes memory) {\r
        require(address(this).balance >= value, "Address: insufficient balance for call");\r
        (bool success, bytes memory returndata) = target.call{value: value}(data);\r
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\r
    }\r
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\r
        return functionStaticCall(target, data, "Address: low-level static call failed");\r
    }\r
    function functionStaticCall(\r
        address target,\r
        bytes memory data,\r
        string memory errorMessage\r
    ) internal view returns (bytes memory) {\r
        (bool success, bytes memory returndata) = target.staticcall(data);\r
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\r
    }\r
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\r
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");\r
    }\r
    function functionDelegateCall(\r
        address target,\r
        bytes memory data,\r
        string memory errorMessage\r
    ) internal returns (bytes memory) {\r
        (bool success, bytes memory returndata) = target.delegatecall(data);\r
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\r
    }\r
    function verifyCallResultFromTarget(\r
        address target,\r
        bool success,\r
        bytes memory returndata,\r
        string memory errorMessage\r
    ) internal view returns (bytes memory) {\r
        if (success) {\r
            if (returndata.length == 0) {\r
                // only check isContract if the call was successful and the return data is empty\r
                // otherwise we already know that it was a contract\r
                require(isContract(target), "Address: call to non-contract");\r
            }\r
            return returndata;\r
        } else {\r
            _revert(returndata, errorMessage);\r
        }\r
    }\r
    function verifyCallResult(\r
        bool success,\r
        bytes memory returndata,\r
        string memory errorMessage\r
    ) internal pure returns (bytes memory) {\r
        if (success) {\r
            return returndata;\r
        } else {\r
            _revert(returndata, errorMessage);\r
        }\r
    }\r
    function _revert(bytes memory returndata, string memory errorMessage) private pure {\r
        // Look for revert reason and bubble it up if present\r
        if (returndata.length > 0) {\r
            // The easiest way to bubble the revert reason is using memory via assembly\r
            /// @solidity memory-safe-assembly\r
            assembly {\r
                let returndata_size := mload(returndata)\r
                revert(add(32, returndata), returndata_size)\r
            }\r
        } else {\r
            revert(errorMessage);\r
        }\r
    }\r
}\r
\r
pragma solidity ^0.8.0;\r
\r
interface IERC20 {\r
    event Transfer(address indexed from, address indexed to, uint256 value);\r
    event Approval(address indexed owner, address indexed spender, uint256 value);\r
    function totalSupply() external view returns (uint256);\r
    function balanceOf(address account) external view returns (uint256);\r
    function transfer(address to, uint256 amount) external returns (bool);\r
    function allowance(address owner, address spender) external view returns (uint256);\r
    function approve(address spender, uint256 amount) external returns (bool);\r
    function transferFrom(address from, address to, uint256 amount) external returns (bool);\r
}\r
\r
interface IERC20Metadata is IERC20 {\r
    function name() external view returns (string memory);\r
    function symbol() external view returns (string memory);\r
    function decimals() external view returns (uint8);\r
}\r
\r
abstract contract Context {\r
    function _msgSender() internal view virtual returns (address) {\r
        return msg.sender;\r
    }\r
\r
    function _msgData() internal view virtual returns (bytes calldata) {\r
        return msg.data;\r
    }\r
}\r
\r
contract ERC20 is Context, IERC20, IERC20Metadata {\r
    mapping(address => uint256) private _balances;\r
\r
    mapping(address => mapping(address => uint256)) private _allowances;\r
\r
    uint256 private _totalSupply;\r
\r
    string private _name;\r
    string private _symbol;\r
    constructor(string memory name_, string memory symbol_) {\r
        _name = name_;\r
        _symbol = symbol_;\r
    }\r
    function name() public view virtual override returns (string memory) {\r
        return _name;\r
    }\r
    function symbol() public view virtual override returns (string memory) {\r
        return _symbol;\r
    }\r
    function decimals() public view virtual override returns (uint8) {\r
        return 18;\r
    }\r
    function totalSupply() public view virtual override returns (uint256) {\r
        return _totalSupply;\r
    }\r
    function balanceOf(address account) public view virtual override returns (uint256) {\r
        return _balances[account];\r
    }\r
    function transfer(address to, uint256 amount) public virtual override returns (bool) {\r
        address owner = _msgSender();\r
        _transfer(owner, to, amount);\r
        return true;\r
    }\r
    function allowance(address owner, address spender) public view virtual override returns (uint256) {\r
        return _allowances[owner][spender];\r
    }\r
    function approve(address spender, uint256 amount) public virtual override returns (bool) {\r
        address owner = _msgSender();\r
        _approve(owner, spender, amount);\r
        return true;\r
    }\r
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\r
        address spender = _msgSender();\r
        _spendAllowance(from, spender, amount);\r
        _transfer(from, to, amount);\r
        return true;\r
    }\r
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\r
        address owner = _msgSender();\r
        _approve(owner, spender, allowance(owner, spender) + addedValue);\r
        return true;\r
    }\r
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\r
        address owner = _msgSender();\r
        uint256 currentAllowance = allowance(owner, spender);\r
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");\r
        unchecked {\r
            _approve(owner, spender, currentAllowance - subtractedValue);\r
        }\r
\r
        return true;\r
    }\r
    function _transfer(address from, address to, uint256 amount) internal virtual {\r
        require(from != address(0), "ERC20: transfer from the zero address");\r
        require(to != address(0), "ERC20: transfer to the zero address");\r
\r
        _beforeTokenTransfer(from, to, amount);\r
\r
        uint256 fromBalance = _balances[from];\r
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");\r
        unchecked {\r
            _balances[from] = fromBalance - amount;\r
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\r
            // decrementing then incrementing.\r
            _balances[to] += amount;\r
        }\r
\r
        emit Transfer(from, to, amount);\r
\r
        _afterTokenTransfer(from, to, amount);\r
    }\r
    function _mint(address account, uint256 amount) internal virtual {\r
        require(account != address(0), "ERC20: mint to the zero address");\r
\r
        _beforeTokenTransfer(address(0), account, amount);\r
\r
        _totalSupply += amount;\r
        unchecked {\r
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\r
            _balances[account] += amount;\r
        }\r
        emit Transfer(address(0), account, amount);\r
\r
        _afterTokenTransfer(address(0), account, amount);\r
    }\r
    function _burn(address account, uint256 amount) internal virtual {\r
        require(account != address(0), "ERC20: burn from the zero address");\r
\r
        _beforeTokenTransfer(account, address(0), amount);\r
\r
        uint256 accountBalance = _balances[account];\r
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");\r
        unchecked {\r
            _balances[account] = accountBalance - amount;\r
            // Overflow not possible: amount <= accountBalance <= totalSupply.\r
            _totalSupply -= amount;\r
        }\r
\r
        emit Transfer(account, address(0), amount);\r
\r
        _afterTokenTransfer(account, address(0), amount);\r
    }\r
    function _approve(address owner, address spender, uint256 amount) internal virtual {\r
        require(owner != address(0), "ERC20: approve from the zero address");\r
        require(spender != address(0), "ERC20: approve to the zero address");\r
\r
        _allowances[owner][spender] = amount;\r
        emit Approval(owner, spender, amount);\r
    }\r
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\r
        uint256 currentAllowance = allowance(owner, spender);\r
        if (currentAllowance != type(uint256).max) {\r
            require(currentAllowance >= amount, "ERC20: insufficient allowance");\r
            unchecked {\r
                _approve(owner, spender, currentAllowance - amount);\r
            }\r
        }\r
    }\r
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\r
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\r
}\r
\r
abstract contract Ownable is Context {\r
    address private _owner;\r
\r
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r
    constructor() {\r
        _transferOwnership(_msgSender());\r
    }\r
    modifier onlyOwner() {\r
        _checkOwner();\r
        _;\r
    }\r
    function owner() public view virtual returns (address) {\r
        return _owner;\r
    }\r
    function _checkOwner() internal view virtual {\r
        require(owner() == _msgSender(), "Ownable: caller is not the owner");\r
    }\r
    function renounceOwnership() public virtual onlyOwner {\r
        _transferOwnership(address(0));\r
    }\r
    function transferOwnership(address newOwner) public virtual onlyOwner {\r
        require(newOwner != address(0), "Ownable: new owner is the zero address");\r
        _transferOwnership(newOwner);\r
    }\r
    function _transferOwnership(address newOwner) internal virtual {\r
        address oldOwner = _owner;\r
        _owner = newOwner;\r
        emit OwnershipTransferred(oldOwner, newOwner);\r
    }\r
}\r
\r
interface IERC20Permit {\r
    function permit(\r
        address owner,\r
        address spender,\r
        uint256 value,\r
        uint256 deadline,\r
        uint8 v,\r
        bytes32 r,\r
        bytes32 s\r
    ) external;\r
    function nonces(address owner) external view returns (uint256);\r
    function DOMAIN_SEPARATOR() external view returns (bytes32);\r
}\r
\r
library SafeERC20 {\r
    using Address for address;\r
    function safeTransfer(IERC20 token, address to, uint256 value) internal {\r
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\r
    }\r
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\r
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\r
    }\r
    function safeApprove(IERC20 token, address spender, uint256 value) internal {\r
        // safeApprove should only be called when setting an initial allowance,\r
        // or when resetting it to zero. To increase and decrease it, use\r
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\r
        require(\r
            (value == 0) || (token.allowance(address(this), spender) == 0),\r
            "SafeERC20: approve from non-zero to non-zero allowance"\r
        );\r
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\r
    }\r
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\r
        uint256 oldAllowance = token.allowance(address(this), spender);\r
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\r
    }\r
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\r
        unchecked {\r
            uint256 oldAllowance = token.allowance(address(this), spender);\r
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");\r
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\r
        }\r
    }\r
    function forceApprove(IERC20 token, address spender, uint256 value) internal {\r
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\r
\r
        if (!_callOptionalReturnBool(token, approvalCall)) {\r
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\r
            _callOptionalReturn(token, approvalCall);\r
        }\r
    }\r
    function safePermit(\r
        IERC20Permit token,\r
        address owner,\r
        address spender,\r
        uint256 value,\r
        uint256 deadline,\r
        uint8 v,\r
        bytes32 r,\r
        bytes32 s\r
    ) internal {\r
        uint256 nonceBefore = token.nonces(owner);\r
        token.permit(owner, spender, value, deadline, v, r, s);\r
        uint256 nonceAfter = token.nonces(owner);\r
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");\r
    }\r
    function _callOptionalReturn(IERC20 token, bytes memory data) private {\r
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\r
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\r
        // the target address contains contract code and also asserts for success in the low-level call.\r
\r
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");\r
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");\r
    }\r
\r
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\r
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\r
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\r
        // and not revert is the subcall reverts.\r
\r
        (bool success, bytes memory returndata) = address(token).call(data);\r
        return\r
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\r
    }\r
}\r
\r
library Math {\r
    enum Rounding {\r
        Down, // Toward negative infinity\r
        Up, // Toward infinity\r
        Zero // Toward zero\r
    }\r
    function max(uint256 a, uint256 b) internal pure returns (uint256) {\r
        return a > b ? a : b;\r
    }\r
    function min(uint256 a, uint256 b) internal pure returns (uint256) {\r
        return a < b ? a : b;\r
    }\r
    function average(uint256 a, uint256 b) internal pure returns (uint256) {\r
        // (a + b) / 2 can overflow.\r
        return (a & b) + (a ^ b) / 2;\r
    }\r
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\r
        // (a + b - 1) / b can overflow on addition, so we distribute.\r
        return a == 0 ? 0 : (a - 1) / b + 1;\r
    }\r
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\r
        unchecked {\r
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\r
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\r
            // variables such that product = prod1 * 2^256 + prod0.\r
            uint256 prod0; // Least significant 256 bits of the product\r
            uint256 prod1; // Most significant 256 bits of the product\r
            assembly {\r
                let mm := mulmod(x, y, not(0))\r
                prod0 := mul(x, y)\r
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\r
            }\r
\r
            // Handle non-overflow cases, 256 by 256 division.\r
            if (prod1 == 0) {\r
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\r
                // The surrounding unchecked block does not change this fact.\r
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\r
                return prod0 / denominator;\r
            }\r
\r
            // Make sure the result is less than 2^256. Also prevents denominator == 0.\r
            require(denominator > prod1, "Math: mulDiv overflow");\r
\r
            uint256 remainder;\r
            assembly {\r
                // Compute remainder using mulmod.\r
                remainder := mulmod(x, y, denominator)\r
\r
                // Subtract 256 bit number from 512 bit number.\r
                prod1 := sub(prod1, gt(remainder, prod0))\r
                prod0 := sub(prod0, remainder)\r
            }\r
\r
            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\r
            // See https://cs.stackexchange.com/q/138556/92363.\r
\r
            // Does not overflow because the denominator cannot be zero at this stage in the function.\r
            uint256 twos = denominator & (~denominator + 1);\r
            assembly {\r
                // Divide denominator by twos.\r
                denominator := div(denominator, twos)\r
\r
                // Divide [prod1 prod0] by twos.\r
                prod0 := div(prod0, twos)\r
\r
                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\r
                twos := add(div(sub(0, twos), twos), 1)\r
            }\r
\r
            // Shift in bits from prod1 into prod0.\r
            prod0 |= prod1 * twos;\r
\r
            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\r
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\r
            // four bits. That is, denominator * inv = 1 mod 2^4.\r
            uint256 inverse = (3 * denominator) ^ 2;\r
\r
            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\r
            // in modular arithmetic, doubling the correct bits in each step.\r
            inverse *= 2 - denominator * inverse; // inverse mod 2^8\r
            inverse *= 2 - denominator * inverse; // inverse mod 2^16\r
            inverse *= 2 - denominator * inverse; // inverse mod 2^32\r
            inverse *= 2 - denominator * inverse; // inverse mod 2^64\r
            inverse *= 2 - denominator * inverse; // inverse mod 2^128\r
            inverse *= 2 - denominator * inverse; // inverse mod 2^256\r
\r
            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\r
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\r
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\r
            // is no longer required.\r
            result = prod0 * inverse;\r
            return result;\r
        }\r
    }\r
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\r
        uint256 result = mulDiv(x, y, denominator);\r
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\r
            result += 1;\r
        }\r
        return result;\r
    }\r
    function sqrt(uint256 a) internal pure returns (uint256) {\r
        if (a == 0) {\r
            return 0;\r
        }\r
\r
        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\r
        //\r
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have\r
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\r
        //\r
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\r
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\r
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\r
        //\r
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\r
        uint256 result = 1 << (log2(a) >> 1);\r
\r
        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\r
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\r
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\r
        // into the expected uint128 result.\r
        unchecked {\r
            result = (result + a / result) >> 1;\r
            result = (result + a / result) >> 1;\r
            result = (result + a / result) >> 1;\r
            result = (result + a / result) >> 1;\r
            result = (result + a / result) >> 1;\r
            result = (result + a / result) >> 1;\r
            result = (result + a / result) >> 1;\r
            return min(result, a / result);\r
        }\r
    }\r
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\r
        unchecked {\r
            uint256 result = sqrt(a);\r
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\r
        }\r
    }\r
    function log2(uint256 value) internal pure returns (uint256) {\r
        uint256 result = 0;\r
        unchecked {\r
            if (value >> 128 > 0) {\r
                value >>= 128;\r
                result += 128;\r
            }\r
            if (value >> 64 > 0) {\r
                value >>= 64;\r
                result += 64;\r
            }\r
            if (value >> 32 > 0) {\r
                value >>= 32;\r
                result += 32;\r
            }\r
            if (value >> 16 > 0) {\r
                value >>= 16;\r
                result += 16;\r
            }\r
            if (value >> 8 > 0) {\r
                value >>= 8;\r
                result += 8;\r
            }\r
            if (value >> 4 > 0) {\r
                value >>= 4;\r
                result += 4;\r
            }\r
            if (value >> 2 > 0) {\r
                value >>= 2;\r
                result += 2;\r
            }\r
            if (value >> 1 > 0) {\r
                result += 1;\r
            }\r
        }\r
        return result;\r
    }\r
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\r
        unchecked {\r
            uint256 result = log2(value);\r
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\r
        }\r
    }\r
    function log10(uint256 value) internal pure returns (uint256) {\r
        uint256 result = 0;\r
        unchecked {\r
            if (value >= 10 ** 64) {\r
                value /= 10 ** 64;\r
                result += 64;\r
            }\r
            if (value >= 10 ** 32) {\r
                value /= 10 ** 32;\r
                result += 32;\r
            }\r
            if (value >= 10 ** 16) {\r
                value /= 10 ** 16;\r
                result += 16;\r
            }\r
            if (value >= 10 ** 8) {\r
                value /= 10 ** 8;\r
                result += 8;\r
            }\r
            if (value >= 10 ** 4) {\r
                value /= 10 ** 4;\r
                result += 4;\r
            }\r
            if (value >= 10 ** 2) {\r
                value /= 10 ** 2;\r
                result += 2;\r
            }\r
            if (value >= 10 ** 1) {\r
                result += 1;\r
            }\r
        }\r
        return result;\r
    }\r
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\r
        unchecked {\r
            uint256 result = log10(value);\r
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\r
        }\r
    }\r
    function log256(uint256 value) internal pure returns (uint256) {\r
        uint256 result = 0;\r
        unchecked {\r
            if (value >> 128 > 0) {\r
                value >>= 128;\r
                result += 16;\r
            }\r
            if (value >> 64 > 0) {\r
                value >>= 64;\r
                result += 8;\r
            }\r
            if (value >> 32 > 0) {\r
                value >>= 32;\r
                result += 4;\r
            }\r
            if (value >> 16 > 0) {\r
                value >>= 16;\r
                result += 2;\r
            }\r
            if (value >> 8 > 0) {\r
                result += 1;\r
            }\r
        }\r
        return result;\r
    }\r
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\r
        unchecked {\r
            uint256 result = log256(value);\r
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\r
        }\r
    }\r
}\r
\r
pragma solidity >=0.5.0;\r
\r
interface IUniswapV2Factory {\r
    event PairCreated(\r
        address indexed token0,\r
        address indexed token1,\r
        address pair,\r
        uint256\r
    );\r
\r
    function feeTo() external view returns (address);\r
\r
    function feeToSetter() external view returns (address);\r
\r
    function getPair(address tokenA, address tokenB)\r
        external\r
        view\r
        returns (address pair);\r
\r
    function allPairs(uint256) external view returns (address pair);\r
\r
    function allPairsLength() external view returns (uint256);\r
\r
    function createPair(address tokenA, address tokenB)\r
        external\r
        returns (address pair);\r
\r
    function setFeeTo(address) external;\r
\r
    function setFeeToSetter(address) external;\r
}\r
interface IUniswapV2Pair {\r
    event Approval(address indexed owner, address indexed spender, uint value);\r
    event Transfer(address indexed from, address indexed to, uint value);\r
\r
    function name() external pure returns (string memory);\r
    function symbol() external pure returns (string memory);\r
    function decimals() external pure returns (uint8);\r
    function totalSupply() external view returns (uint);\r
    function balanceOf(address owner) external view returns (uint);\r
    function allowance(address owner, address spender) external view returns (uint);\r
\r
    function approve(address spender, uint value) external returns (bool);\r
    function transfer(address to, uint value) external returns (bool);\r
    function transferFrom(address from, address to, uint value) external returns (bool);\r
\r
    function DOMAIN_SEPARATOR() external view returns (bytes32);\r
    function PERMIT_TYPEHASH() external pure returns (bytes32);\r
    function nonces(address owner) external view returns (uint);\r
\r
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\r
\r
    event Mint(address indexed sender, uint amount0, uint amount1);\r
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);\r
    event Swap(\r
        address indexed sender,\r
        uint amount0In,\r
        uint amount1In,\r
        uint amount0Out,\r
        uint amount1Out,\r
        address indexed to\r
    );\r
    event Sync(uint112 reserve0, uint112 reserve1);\r
\r
    function MINIMUM_LIQUIDITY() external pure returns (uint);\r
    function factory() external view returns (address);\r
    function token0() external view returns (address);\r
    function token1() external view returns (address);\r
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\r
    function price0CumulativeLast() external view returns (uint);\r
    function price1CumulativeLast() external view returns (uint);\r
    function kLast() external view returns (uint);\r
\r
    function mint(address to) external returns (uint liquidity);\r
    function burn(address to) external returns (uint amount0, uint amount1);\r
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;\r
    function skim(address to) external;\r
    function sync() external;\r
\r
    function initialize(address, address) external;\r
}\r
\r
pragma solidity >=0.6.2;\r
\r
interface IUniswapV2Router01 {\r
    function factory() external pure returns (address);\r
\r
    function WETH() external pure returns (address);\r
\r
    function addLiquidity(\r
        address tokenA,\r
        address tokenB,\r
        uint256 amountADesired,\r
        uint256 amountBDesired,\r
        uint256 amountAMin,\r
        uint256 amountBMin,\r
        address to,\r
        uint256 deadline\r
    )\r
        external\r
        returns (\r
            uint256 amountA,\r
            uint256 amountB,\r
            uint256 liquidity\r
        );\r
\r
    function addLiquidityETH(\r
        address token,\r
        uint256 amountTokenDesired,\r
        uint256 amountTokenMin,\r
        uint256 amountETHMin,\r
        address to,\r
        uint256 deadline\r
    )\r
        external\r
        payable\r
        returns (\r
            uint256 amountToken,\r
            uint256 amountETH,\r
            uint256 liquidity\r
        );\r
\r
    function removeLiquidity(\r
        address tokenA,\r
        address tokenB,\r
        uint256 liquidity,\r
        uint256 amountAMin,\r
        uint256 amountBMin,\r
        address to,\r
        uint256 deadline\r
    ) external returns (uint256 amountA, uint256 amountB);\r
\r
    function removeLiquidityETH(\r
        address token,\r
        uint256 liquidity,\r
        uint256 amountTokenMin,\r
        uint256 amountETHMin,\r
        address to,\r
        uint256 deadline\r
    ) external returns (uint256 amountToken, uint256 amountETH);\r
\r
    function removeLiquidityWithPermit(\r
        address tokenA,\r
        address tokenB,\r
        uint256 liquidity,\r
        uint256 amountAMin,\r
        uint256 amountBMin,\r
        address to,\r
        uint256 deadline,\r
        bool approveMax,\r
        uint8 v,\r
        bytes32 r,\r
        bytes32 s\r
    ) external returns (uint256 amountA, uint256 amountB);\r
\r
    function removeLiquidityETHWithPermit(\r
        address token,\r
        uint256 liquidity,\r
        uint256 amountTokenMin,\r
        uint256 amountETHMin,\r
        address to,\r
        uint256 deadline,\r
        bool approveMax,\r
        uint8 v,\r
        bytes32 r,\r
        bytes32 s\r
    ) external returns (uint256 amountToken, uint256 amountETH);\r
\r
    function swapExactTokensForTokens(\r
        uint256 amountIn,\r
        uint256 amountOutMin,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external returns (uint256[] memory amounts);\r
\r
    function swapTokensForExactTokens(\r
        uint256 amountOut,\r
        uint256 amountInMax,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external returns (uint256[] memory amounts);\r
\r
    function swapExactETHForTokens(\r
        uint256 amountOutMin,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external payable returns (uint256[] memory amounts);\r
\r
    function swapTokensForExactETH(\r
        uint256 amountOut,\r
        uint256 amountInMax,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external returns (uint256[] memory amounts);\r
\r
    function swapExactTokensForETH(\r
        uint256 amountIn,\r
        uint256 amountOutMin,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external returns (uint256[] memory amounts);\r
\r
    function swapETHForExactTokens(\r
        uint256 amountOut,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external payable returns (uint256[] memory amounts);\r
\r
    function quote(\r
        uint256 amountA,\r
        uint256 reserveA,\r
        uint256 reserveB\r
    ) external pure returns (uint256 amountB);\r
\r
    function getAmountOut(\r
        uint256 amountIn,\r
        uint256 reserveIn,\r
        uint256 reserveOut\r
    ) external pure returns (uint256 amountOut);\r
\r
    function getAmountIn(\r
        uint256 amountOut,\r
        uint256 reserveIn,\r
        uint256 reserveOut\r
    ) external pure returns (uint256 amountIn);\r
\r
    function getAmountsOut(uint256 amountIn, address[] calldata path)\r
        external\r
        view\r
        returns (uint256[] memory amounts);\r
\r
    function getAmountsIn(uint256 amountOut, address[] calldata path)\r
        external\r
        view\r
        returns (uint256[] memory amounts);\r
}\r
interface IUniswapV2Router02 is IUniswapV2Router01 {\r
    function removeLiquidityETHSupportingFeeOnTransferTokens(\r
        address token,\r
        uint256 liquidity,\r
        uint256 amountTokenMin,\r
        uint256 amountETHMin,\r
        address to,\r
        uint256 deadline\r
    ) external returns (uint256 amountETH);\r
\r
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(\r
        address token,\r
        uint256 liquidity,\r
        uint256 amountTokenMin,\r
        uint256 amountETHMin,\r
        address to,\r
        uint256 deadline,\r
        bool approveMax,\r
        uint8 v,\r
        bytes32 r,\r
        bytes32 s\r
    ) external returns (uint256 amountETH);\r
\r
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(\r
        uint256 amountIn,\r
        uint256 amountOutMin,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external;\r
\r
    function swapExactETHForTokensSupportingFeeOnTransferTokens(\r
        uint256 amountOutMin,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external payable;\r
\r
    function swapExactTokensForETHSupportingFeeOnTransferTokens(\r
        uint256 amountIn,\r
        uint256 amountOutMin,\r
        address[] calldata path,\r
        address to,\r
        uint256 deadline\r
    ) external;\r
}\r
pragma solidity 0.8.19;\r
\r
interface IUniswapV2Caller {\r
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(\r
        address router,\r
        uint256 amountIn,\r
        uint256 amountOutMin,\r
        address[] calldata path,\r
        uint256 deadline\r
    ) external;\r
}\r
interface IFee {\r
    function payFee(\r
        uint256 _tokenType,\r
        address creator,\r
        bool isAntibot,\r
        address referrer\r
    ) external payable;\r
}\r
contract StandardToken is ERC20, Ownable {\r
    using SafeERC20 for IERC20;\r
    struct Args {\r
        string name;\r
        string symbol;\r
        uint8 decimals;\r
        uint256 totalSupply;\r
        uint256 maxWallet;\r
        uint256 maxTransactionAmount;\r
        address marketingWallet;\r
        address baseTokenForMarket;\r
        address mainRouter;\r
        bool isMarketingFeeBaseToken;\r
        uint24 sellLiquidityFee;\r
        uint24 buyLiquidityFee;\r
        uint24 sellMarketingFee;\r
        uint24 buyMarketingFee;\r
        address feeContract;\r
        address uniswapV2Caller;\r
    }\r
    IUniswapV2Caller public uniswapV2Caller;\r
\r
    uint256 private constant MAX = ~uint256(0);\r
\r
    uint8 private _decimals;\r
    ///////////////////////////////////////////////////////////////////////////\r
    address public baseTokenForMarket;\r
    bool public isBaseTokenWETH;\r
    bool private inSwapAndLiquify;\r
    uint24 public sellLiquidityFee;\r
    uint24 public buyLiquidityFee;\r
\r
    uint24 public sellMarketingFee;\r
    uint24 public buyMarketingFee;\r
\r
    address public marketingWallet;\r
    bool public isMarketingFeeBaseToken;\r
\r
    uint256 public minAmountToTakeFee;\r
    uint256 public maxWallet;\r
    uint256 public maxTransactionAmount;\r
\r
    address public mainRouter;\r
    address public mainPair;\r
\r
\r
    mapping(address => bool) public isExcludedFromMaxTransactionAmount;\r
    mapping(address => bool) public isExcludedFromFee;\r
    mapping(address => bool) public automatedMarketMakerPairs;\r
\r
    uint256 private _liquidityFeeTokens;\r
    uint256 private _marketingFeeTokens;\r
    event UpdateLiquidityFee(\r
        uint24 newSellLiquidityFee,\r
        uint24 newBuyLiquidityFee,\r
        uint24 oldSellLiquidityFee,\r
        uint24 oldBuyLiquidityFee\r
    );\r
    event UpdateMarketingFee(\r
        uint24 newSellMarketingFee,\r
        uint24 newBuyMarketingFee,\r
        uint24 oldSellMarketingFee,\r
        uint24 oldBuyMarketingFee\r
    );\r
    event UpdateMarketingWallet(\r
        address indexed newMarketingWallet,\r
        bool newIsMarketingFeeBaseToken,\r
        address indexed oldMarketingWallet,\r
        bool oldIsMarketingFeeBaseToken\r
    );\r
    event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded);\r
    event UpdateMinAmountToTakeFee(uint256 newMinAmountToTakeFee, uint256 oldMinAmountToTakeFee);\r
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);\r
    event ExcludedFromFee(address indexed account, bool isEx);\r
    event SwapAndLiquify(\r
        uint256 tokensForLiquidity,\r
        uint256 baseTokenForLiquidity\r
    );\r
    event MarketingFeeTaken(\r
        uint256 marketingFeeTokens,\r
        uint256 marketingFeeBaseTokenSwapped\r
    );\r
    event MainRouterUpdated(\r
        address mainRouter, address mainPair, address baseTokenForMarket\r
    );\r
    event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet);\r
    event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount);\r
    ///////////////////////////////////////////////////////////////////////////////\r
 \r
\r
    constructor(\r
        Args memory args,\r
        address[] memory autoApproveAddressList,\r
        address referrer\r
    ) ERC20(args.name, args.symbol) payable {\r
        IFee(args.feeContract).payFee{value: msg.value}(1, _msgSender(), false, referrer);   \r
        _decimals = args.decimals;\r
        _mint(msg.sender, args.totalSupply);\r
        uniswapV2Caller = IUniswapV2Caller(args.uniswapV2Caller);\r
        baseTokenForMarket=args.baseTokenForMarket;\r
        require(args.marketingWallet!=address(0), "marketing wallet can not be 0");\r
        require(args.mainRouter!=address(0), "Router address can not be 0");\r
        require(args.sellLiquidityFee+args.sellMarketingFee<=200000, "sell fee <= 20%");\r
        require(args.buyLiquidityFee+args.buyMarketingFee<=200000, "buy fee <= 20%");\r
\r
        marketingWallet=args.marketingWallet;\r
        isMarketingFeeBaseToken=args.isMarketingFeeBaseToken;\r
        emit UpdateMarketingWallet(\r
            marketingWallet,\r
            isMarketingFeeBaseToken,\r
            address(0),\r
            false\r
        );\r
        mainRouter=args.mainRouter;\r
        if(baseTokenForMarket != IUniswapV2Router02(mainRouter).WETH()){            \r
            IERC20(baseTokenForMarket).safeApprove(mainRouter, MAX);            \r
        }else{\r
            isBaseTokenWETH=true;\r
        }\r
       \r
        \r
        _approve(address(this), address(uniswapV2Caller), MAX);\r
        _approve(address(this), mainRouter, MAX);\r
        for(uint256 i=0;i<autoApproveAddressList.length;i++){\r
            _approve(_msgSender(), autoApproveAddressList[i], MAX);\r
            isExcludedFromFee[autoApproveAddressList[i]] = true;\r
            isExcludedFromMaxTransactionAmount[autoApproveAddressList[i]]=true;\r
        }\r
        \r
        emit MainRouterUpdated(mainRouter, mainPair, baseTokenForMarket);\r
        mainPair = IUniswapV2Factory(IUniswapV2Router02(mainRouter).factory()).createPair(\r
            address(this),\r
            baseTokenForMarket\r
        );\r
 \r
        \r
        require(args.maxTransactionAmount>=args.totalSupply / 10000, "maxTransactionAmount >= total supply / 10000");\r
        require(args.maxWallet>=args.totalSupply / 10000, "maxWallet >= total supply / 10000");\r
        maxWallet=args.maxWallet;\r
        emit UpdateMaxWallet(maxWallet, 0);\r
        maxTransactionAmount=args.maxTransactionAmount;\r
        emit UpdateMaxTransactionAmount(maxTransactionAmount, 0);\r
        \r
        sellLiquidityFee=args.sellLiquidityFee;\r
        buyLiquidityFee=args.buyLiquidityFee;\r
        emit UpdateLiquidityFee(sellLiquidityFee, buyLiquidityFee, 0, 0);        \r
        sellMarketingFee=args.sellMarketingFee;\r
        buyMarketingFee=args.buyMarketingFee;\r
        emit UpdateMarketingFee(\r
            sellMarketingFee,\r
            buyMarketingFee,\r
            0,\r
            0\r
        );\r
        minAmountToTakeFee=args.totalSupply/10000;\r
        emit UpdateMinAmountToTakeFee(minAmountToTakeFee, 0);\r
        isExcludedFromFee[address(this)]=true;\r
        isExcludedFromFee[marketingWallet]=true;\r
        isExcludedFromFee[_msgSender()]=true;\r
        isExcludedFromFee[address(0xdead)] = true;\r
        isExcludedFromMaxTransactionAmount[address(0xdead)]=true;\r
        isExcludedFromMaxTransactionAmount[address(this)]=true;\r
        isExcludedFromMaxTransactionAmount[marketingWallet]=true;\r
        isExcludedFromMaxTransactionAmount[_msgSender()]=true;\r
        _setAutomatedMarketMakerPair(mainPair, true);\r
    }\r
\r
    function decimals() public view override returns (uint8) {\r
        return _decimals;\r
    }\r
\r
    function updateMainPair(\r
        address _mainRouter,\r
        address _baseTokenForMarket\r
    ) external onlyOwner {\r
        baseTokenForMarket = _baseTokenForMarket;\r
        if(mainRouter != _mainRouter){\r
            _approve(address(this), _mainRouter, MAX);\r
            mainRouter = _mainRouter;\r
        } \r
        mainPair = IUniswapV2Factory(IUniswapV2Router02(mainRouter).factory()).createPair(\r
            address(this),\r
            baseTokenForMarket\r
        );\r
        if(baseTokenForMarket != IUniswapV2Router02(mainRouter).WETH()){            \r
            IERC20(baseTokenForMarket).safeApprove(mainRouter, MAX);\r
            isBaseTokenWETH=false;            \r
        }else{\r
            isBaseTokenWETH=true;\r
        }\r
     \r
        emit MainRouterUpdated(mainRouter, mainPair, baseTokenForMarket);\r
        _setAutomatedMarketMakerPair(mainPair, true);\r
    }\r
\r
\r
    /////////////////////////////////////////////////////////////////////////////////\r
    modifier lockTheSwap() {\r
        inSwapAndLiquify = true;\r
        _;\r
        inSwapAndLiquify = false;\r
    }\r
\r
    function updateLiquidityFee(\r
        uint24 _sellLiquidityFee,\r
        uint24 _buyLiquidityFee\r
    ) external onlyOwner {\r
        require(\r
            _sellLiquidityFee + sellMarketingFee <= 200000,\r
            "sell fee <= 20%"\r
        );\r
        require(_buyLiquidityFee + buyMarketingFee <= 200000, "buy fee <= 20%");\r
        emit UpdateLiquidityFee(\r
            _sellLiquidityFee,\r
            _buyLiquidityFee,\r
            sellLiquidityFee,\r
            buyLiquidityFee\r
        );\r
        sellLiquidityFee = _sellLiquidityFee;\r
        buyLiquidityFee = _buyLiquidityFee;           \r
    }\r
\r
    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {\r
        require(_maxWallet>=totalSupply() / 10000, "maxWallet >= total supply / 10000");\r
        emit UpdateMaxWallet(_maxWallet, maxWallet);\r
        maxWallet = _maxWallet;\r
    }\r
\r
    function updateMaxTransactionAmount(uint256 _maxTransactionAmount)\r
        external\r
        onlyOwner\r
    {\r
        require(_maxTransactionAmount>=totalSupply() / 10000, "maxTransactionAmount >= total supply / 10000");\r
        emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount);\r
        maxTransactionAmount = _maxTransactionAmount;\r
    }\r
\r
    function updateMarketingFee(\r
        uint24 _sellMarketingFee,\r
        uint24 _buyMarketingFee\r
    ) external onlyOwner {\r
        require(\r
            _sellMarketingFee + sellLiquidityFee <= 200000,\r
            "sell fee <= 20%"\r
        );\r
        require(_buyMarketingFee + buyLiquidityFee <= 200000, "buy fee <= 20%");\r
        emit UpdateMarketingFee(\r
            _sellMarketingFee,\r
            _buyMarketingFee,\r
            sellMarketingFee,\r
            buyMarketingFee\r
        );\r
        sellMarketingFee = _sellMarketingFee;\r
        buyMarketingFee = _buyMarketingFee;  \r
    }\r
\r
    function updateMarketingWallet(\r
        address _marketingWallet,\r
        bool _isMarketingFeeBaseToken\r
    ) external onlyOwner {\r
        require(_marketingWallet != address(0), "marketing wallet can't be 0");\r
        emit UpdateMarketingWallet(_marketingWallet, _isMarketingFeeBaseToken,\r
            marketingWallet, isMarketingFeeBaseToken);\r
        marketingWallet = _marketingWallet;\r
        isMarketingFeeBaseToken = _isMarketingFeeBaseToken;\r
        isExcludedFromFee[_marketingWallet] = true;\r
        isExcludedFromMaxTransactionAmount[_marketingWallet] = true;\r
    }\r
\r
    function updateMinAmountToTakeFee(uint256 _minAmountToTakeFee)\r
        external\r
        onlyOwner\r
    {\r
        require(_minAmountToTakeFee > 0, "minAmountToTakeFee > 0");\r
        emit UpdateMinAmountToTakeFee(_minAmountToTakeFee, minAmountToTakeFee);\r
        minAmountToTakeFee = _minAmountToTakeFee;     \r
    }\r
\r
    function setAutomatedMarketMakerPair(address pair, bool value)\r
        public\r
        onlyOwner\r
    {\r
        require(\r
            automatedMarketMakerPairs[pair] != value,\r
            "Automated market maker pair is already set to that value"\r
        );\r
        _setAutomatedMarketMakerPair(pair, value);\r
    }\r
\r
    function _setAutomatedMarketMakerPair(address pair, bool value) private {        \r
        automatedMarketMakerPairs[pair] = value;\r
        isExcludedFromMaxTransactionAmount[pair] = value;\r
        emit SetAutomatedMarketMakerPair(pair, value);\r
    }\r
\r
    function excludeFromFee(address account, bool isEx) external onlyOwner {\r
        require(isExcludedFromFee[account] != isEx, "already");\r
        isExcludedFromFee[account] = isEx;\r
        emit ExcludedFromFee(account, isEx);\r
    }\r
\r
    function excludeFromMaxTransactionAmount(address account, bool isEx)\r
        external\r
        onlyOwner\r
    {\r
        require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already");\r
        isExcludedFromMaxTransactionAmount[account] = isEx;\r
        emit ExcludedFromMaxTransactionAmount(account, isEx);\r
    }\r
\r
    function _transfer(\r
        address from,\r
        address to,\r
        uint256 amount\r
    ) internal override {\r
        require(from != address(0), "ERC20: transfer from the zero address");\r
        require(to != address(0), "ERC20: transfer to the zero address");\r
        uint256 contractTokenBalance = balanceOf(address(this));\r
        \r
        uint256 totalTokensTaken = _liquidityFeeTokens + _marketingFeeTokens;\r
        bool overMinimumTokenBalance = totalTokensTaken >=\r
            minAmountToTakeFee && totalTokensTaken <= contractTokenBalance;\r
        // Take Fee\r
        if (\r
            !inSwapAndLiquify &&\r
            balanceOf(mainPair) > 0 &&\r
            overMinimumTokenBalance &&\r
            automatedMarketMakerPairs[to]\r
        ) {\r
            takeFee();\r
        }\r
\r
        uint256 _liquidityFee;\r
        uint256 _marketingFee;\r
        // If any account belongs to isExcludedFromFee account then remove the fee\r
\r
        if (\r
            !inSwapAndLiquify &&\r
            !isExcludedFromFee[from] &&\r
            !isExcludedFromFee[to]\r
        ) {\r
            // Buy\r
            if (automatedMarketMakerPairs[from]) {\r
                _liquidityFee = amount * buyLiquidityFee / 1000000;\r
                _marketingFee = amount * buyMarketingFee / 1000000;\r
            }\r
            // Sell\r
            else if (automatedMarketMakerPairs[to]) {\r
                _liquidityFee = amount * sellLiquidityFee / 1000000;\r
                _marketingFee = amount * sellMarketingFee / 1000000;\r
            }\r
            uint256 _feeTotal = _liquidityFee + _marketingFee;\r
            if (_feeTotal > 0) super._transfer(from, address(this), _feeTotal);\r
            amount = amount - _liquidityFee - _marketingFee;\r
            _liquidityFeeTokens = _liquidityFeeTokens + _liquidityFee;\r
            _marketingFeeTokens = _marketingFeeTokens + _marketingFee;\r
        }\r
        super._transfer(from, to, amount);\r
        if (!inSwapAndLiquify) {\r
            if (!isExcludedFromMaxTransactionAmount[from]) {\r
                require(\r
                    amount <= maxTransactionAmount,\r
                    "ERC20: exceeds transfer limit"\r
                );\r
            }\r
            if (!isExcludedFromMaxTransactionAmount[to]) {\r
                require(\r
                    balanceOf(to) <= maxWallet,\r
                    "ERC20: exceeds max wallet limit"\r
                );\r
            }\r
        }\r
    }\r
\r
    function takeFee() private lockTheSwap {\r
\r
        // Halve the amount of liquidity tokens\r
        uint256 tokensForLiquidity = _liquidityFeeTokens / 2;\r
        uint256 initialBaseTokenBalance = isBaseTokenWETH ? address(this).balance\r
            : IERC20(baseTokenForMarket).balanceOf(address(this));        \r
         \r
        uint256 baseTokenForLiquidity;\r
        if (isMarketingFeeBaseToken) {\r
            uint256 tokensForSwap=tokensForLiquidity+_marketingFeeTokens;\r
            if(tokensForSwap>0)\r
                swapTokensForBaseToken(tokensForSwap);\r
            uint256 baseTokenBalance = isBaseTokenWETH ? address(this).balance - initialBaseTokenBalance\r
                : IERC20(baseTokenForMarket).balanceOf(address(this)) - initialBaseTokenBalance;\r
            uint256 baseTokenAmountForMarketing = (baseTokenBalance *\r
                _marketingFeeTokens) / tokensForSwap;\r
            baseTokenForLiquidity = baseTokenBalance - baseTokenAmountForMarketing;\r
            if(baseTokenAmountForMarketing>0){\r
                if(isBaseTokenWETH){                \r
                    (bool success, )=address(marketingWallet).call{value: baseTokenAmountForMarketing}("");\r
                    if(success){\r
                        emit MarketingFeeTaken(0, baseTokenAmountForMarketing);\r
                    }\r
                }else{\r
                    IERC20(baseTokenForMarket).safeTransfer(\r
                        marketingWallet,\r
                        baseTokenAmountForMarketing\r
                    );\r
                    emit MarketingFeeTaken(0, baseTokenAmountForMarketing);\r
                }                \r
            }            \r
        } else {\r
            if(tokensForLiquidity>0)\r
                swapTokensForBaseToken(tokensForLiquidity);\r
            baseTokenForLiquidity = isBaseTokenWETH ? address(this).balance - initialBaseTokenBalance\r
                : IERC20(baseTokenForMarket).balanceOf(address(this)) - initialBaseTokenBalance;\r
            if(_marketingFeeTokens>0){\r
                _transfer(address(this), marketingWallet, _marketingFeeTokens);\r
                emit MarketingFeeTaken(_marketingFeeTokens, 0);                \r
            }            \r
        }\r
\r
        if (tokensForLiquidity > 0 && baseTokenForLiquidity > 0) {\r
            addLiquidity(tokensForLiquidity, baseTokenForLiquidity);\r
            emit SwapAndLiquify(tokensForLiquidity, baseTokenForLiquidity);\r
        }\r
        _marketingFeeTokens = 0;\r
        _liquidityFeeTokens = 0;    \r
        if(balanceOf(address(this))>0){\r
            if(owner()!=address(0)){\r
                _transfer(address(this), owner(), balanceOf(address(this)));  \r
            }else{\r
                _transfer(address(this), address(0xdead), balanceOf(address(this)));  \r
            }\r
        } \r
    }\r
\r
    function swapTokensForBaseToken(uint256 tokenAmount) private {\r
        address[] memory path = new address[](2);\r
        path[0] = address(this);\r
        path[1] = baseTokenForMarket;     \r
        if (isBaseTokenWETH){\r
            IUniswapV2Router02(mainRouter).swapExactTokensForETHSupportingFeeOnTransferTokens(\r
                tokenAmount,\r
                0, // accept any amount of BaseToken\r
                path,\r
                address(this),\r
                block.timestamp\r
            );\r
        }else{\r
            uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens(\r
                    address(mainRouter),\r
                    tokenAmount,\r
                    0, // accept any amount of BaseToken\r
                    path,\r
                    block.timestamp\r
                );\r
        }\r
        \r
    }\r
\r
    function addLiquidity(uint256 tokenAmount, uint256 baseTokenAmount)\r
        private\r
    {\r
        if (isBaseTokenWETH) \r
            IUniswapV2Router02(mainRouter).addLiquidityETH{value: baseTokenAmount}(\r
                address(this),\r
                tokenAmount,\r
                0, // slippage is unavoidable\r
                0, // slippage is unavoidable\r
                address(0xdead),\r
                block.timestamp\r
            );\r
        else{\r
            IUniswapV2Router02(mainRouter).addLiquidity(\r
                address(this),\r
                baseTokenForMarket,\r
                tokenAmount,\r
                baseTokenAmount,\r
                0,\r
                0,\r
                address(0xdead),\r
                block.timestamp\r
            );\r
        }  \r
    }\r
\r
    function withdrawETH() external onlyOwner {\r
        (bool success, )=address(owner()).call{value: address(this).balance}("");\r
        require(success, "Failed in withdrawal");\r
    }\r
    function withdrawToken(address token) external onlyOwner{\r
        require(address(this) != token, "Not allowed");\r
        IERC20(token).safeTransfer(owner(), IERC20(token).balanceOf(address(this)));\r
    }\r
    receive() external payable {}\r
}\r
"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "libraries": {}
  }
}}

Tags:
ERC20, Multisig, Mintable, Burnable, Swap, Liquidity, Upgradeable, Multi-Signature, Factory|addr:0x4d8d0fa23776e51fefa9b6a3bf75ac403048ecfa|verified:true|block:23730347|tx:0x670d2f3982fcc5c95acef66257299890d7946122fe2e5f1d4147231ee17d7bdc|first_check:1762341969

Submitted on: 2025-11-05 12:26:11

Comments

Log in to comment.

No comments yet.