ETH Price: $2,761.31 (+8.43%)

Transaction Decoder

Block:
17829109 at Aug-02-2023 06:29:47 PM +UTC
Transaction Fee:
0.000872975241559242 ETH $2.41
Gas Used:
23,679 Gas / 36.867065398 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x57Df8526...0bE7a52B0
1.002039162456924201 Eth
Nonce: 73
1.001166187215364959 Eth
Nonce: 74
0.000872975241559242
(beaverbuild)
13.885068558066769944 Eth13.885075661766769944 Eth0.0000071037

Execution Trace

pushin.CALL( )
  • 0x57df852645d6d45749898826ac61f560be7a52b0.CALL( )
    /**
     *Submitted for verification at Etherscan.io on 2022-01-21
    */
    
    // SPDX-License-Identifier: MIT
    
    pragma solidity 0.8.11;
    
    abstract contract Context {
        function _msgSender() internal view virtual returns (address) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes calldata) {
            this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
            return msg.data;
        }
    }
    
    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 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 IERC20 {
        function totalSupply() external view returns (uint256);
        function balanceOf(address account) external view returns (uint256);
        function transfer(address recipient, uint256 amount) external returns (bool);
        function allowance(address owner, address spender) external view returns (uint256);
        function approve(address spender, uint256 amount) external returns (bool);
        function transferFrom(
            address sender,
            address recipient,
            uint256 amount
        ) external returns (bool);
        
        event Transfer(address indexed from, address indexed to, uint256 value);
        event Approval(address indexed owner, address indexed spender, uint256 value);
    }
    
    interface IERC20Metadata is IERC20 {
        function name() external view returns (string memory);
        function symbol() external view returns (string memory);
        function decimals() external view returns (uint8);
    }
    
    
    contract ERC20 is Context, IERC20, IERC20Metadata {
        using SafeMath for uint256;
    
        mapping(address => uint256) private _balances;
    
        mapping(address => mapping(address => uint256)) private _allowances;
    
        uint256 private _totalSupply;
    
        string private _name;
        string private _symbol;
    
        constructor(string memory name_, string memory symbol_) {
            _name = name_;
            _symbol = symbol_;
        }
    
        function name() public view virtual override returns (string memory) {
            return _name;
        }
    
        function symbol() public view virtual override returns (string memory) {
            return _symbol;
        }
    
        function decimals() public view virtual override returns (uint8) {
            return 9;
        }
    
        function totalSupply() public view virtual override returns (uint256) {
            return _totalSupply;
        }
    
        function balanceOf(address account) public view virtual override returns (uint256) {
            return _balances[account];
        }
    
        function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
            _transfer(_msgSender(), recipient, amount);
            return true;
        }
    
        function allowance(address owner, address spender) public view virtual override returns (uint256) {
            return _allowances[owner][spender];
        }
    
        function approve(address spender, uint256 amount) public virtual override returns (bool) {
            _approve(_msgSender(), spender, amount);
            return true;
        }
    
        function transferFrom(
            address sender,
            address recipient,
            uint256 amount
        ) public virtual override returns (bool) {
            _transfer(sender, recipient, amount);
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
            return true;
        }
    
        function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
            _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
            return true;
        }
    
        function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
            _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
            return true;
        }
    
        function _transfer(
            address sender,
            address recipient,
            uint256 amount
        ) internal virtual {
            require(sender != address(0), "ERC20: transfer from the zero address");
            require(recipient != address(0), "ERC20: transfer to the zero address");
    
            _beforeTokenTransfer(sender, recipient, amount);
    
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            emit Transfer(sender, recipient, amount);
        }
    
        function _mint(address account, uint256 amount) internal virtual {
            require(account != address(0), "ERC20: mint to the zero address");
    
            _beforeTokenTransfer(address(0), account, amount);
    
            _totalSupply = _totalSupply.add(amount);
            _balances[account] = _balances[account].add(amount);
            emit Transfer(address(0), account, amount);
        }
    
        function _burn(address account, uint256 amount) internal virtual {
            require(account != address(0), "ERC20: burn from the zero address");
    
            _beforeTokenTransfer(account, address(0), amount);
    
            _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
            _totalSupply = _totalSupply.sub(amount);
            emit Transfer(account, address(0), amount);
        }
    
        function _approve(
            address owner,
            address spender,
            uint256 amount
        ) internal virtual {
            require(owner != address(0), "ERC20: approve from the zero address");
            require(spender != address(0), "ERC20: approve to the zero address");
    
            _allowances[owner][spender] = amount;
            emit Approval(owner, spender, amount);
        }
    
        function _beforeTokenTransfer(
            address from,
            address to,
            uint256 amount
        ) internal virtual {}
    }
    
    library SafeMath {
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
    
            return c;
        }
    
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            return sub(a, b, "SafeMath: subtraction overflow");
        }
    
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            uint256 c = a - b;
    
            return c;
        }
    
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            if (a == 0) {
                return 0;
            }
    
            uint256 c = a * b;
            require(c / a == b, "SafeMath: multiplication overflow");
    
            return c;
        }
    
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            return div(a, b, "SafeMath: division by zero");
        }
    
        function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b > 0, errorMessage);
            uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    
            return c;
        }
    
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            return mod(a, b, "SafeMath: modulo by zero");
        }
    
        function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b != 0, errorMessage);
            return a % b;
        }
    }
    
    contract Ownable is Context {
        address private _owner;
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
        constructor () {
            address msgSender = _msgSender();
            _owner = msgSender;
            emit OwnershipTransferred(address(0), msgSender);
        }
    
        function owner() public view returns (address) {
            return _owner;
        }
    
        modifier onlyOwner() {
            require(_owner == _msgSender(), "Ownable: caller is not the owner");
            _;
        }
    
        function renounceOwnership() public virtual onlyOwner {
            emit OwnershipTransferred(_owner, address(0));
            _owner = address(0);
        }
    
        function transferOwnership(address newOwner) public virtual onlyOwner {
            require(newOwner != address(0), "Ownable: new owner is the zero address");
            emit OwnershipTransferred(_owner, newOwner);
            _owner = newOwner;
        }
    }
    
    
    
    library SafeMathInt {
        int256 private constant MIN_INT256 = int256(1) << 255;
        int256 private constant MAX_INT256 = ~(int256(1) << 255);
    
        function mul(int256 a, int256 b) internal pure returns (int256) {
            int256 c = a * b;
    
            require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
            require((b == 0) || (c / b == a));
            return c;
        }
    
        function div(int256 a, int256 b) internal pure returns (int256) {
            require(b != -1 || a != MIN_INT256);
    
            return a / b;
        }
    
        function sub(int256 a, int256 b) internal pure returns (int256) {
            int256 c = a - b;
            require((b >= 0 && c <= a) || (b < 0 && c > a));
            return c;
        }
    
        function add(int256 a, int256 b) internal pure returns (int256) {
            int256 c = a + b;
            require((b >= 0 && c >= a) || (b < 0 && c < a));
            return c;
        }
    
        function abs(int256 a) internal pure returns (int256) {
            require(a != MIN_INT256);
            return a < 0 ? -a : a;
        }
    
        function toUint256Safe(int256 a) internal pure returns (uint256) {
            require(a >= 0);
            return uint256(a);
        }
    }
    
    library SafeMathUint {
      function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
      }
    }
    
    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;
    }
    
    contract pushin is ERC20, Ownable {
        using SafeMath for uint256;
    
        IUniswapV2Router02 public immutable uniswapV2Router;
        address public immutable uniswapV2Pair;
    
        mapping (address => bool) private _isSniper;
        bool private _swapping;
        uint256 private _launchTime;
    
        address public feeWallet;
        
        uint256 public maxTransactionAmount;
        uint256 public swapTokensAtAmount;
        uint256 public maxWallet;
            
        bool public limitsInEffect = true;
        bool public tradingActive = false;
        
        // Anti-bot and anti-whale mappings and variables
        mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
        bool public transferDelayEnabled = true;
    
        uint256 public buyTotalFees;
        uint256 private _buyMarketingFee;
        uint256 private _buyLiquidityFee;
        uint256 private _buyDevFee;
        
        uint256 public sellTotalFees;
        uint256 private _sellMarketingFee;
        uint256 private _sellLiquidityFee;
        uint256 private _sellDevFee;
        
        uint256 private _tokensForMarketing;
        uint256 private _tokensForLiquidity;
        uint256 private _tokensForDev;
        
        /******************/
    
        // exlcude from fees and max transaction amount
        mapping (address => bool) private _isExcludedFromFees;
        mapping (address => bool) public _isExcludedMaxTransactionAmount;
    
        // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
        // could be subject to a maximum transfer amount
        mapping (address => bool) public automatedMarketMakerPairs;
    
        event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
        event ExcludeFromFees(address indexed account, bool isExcluded);
        event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
        event feeWalletUpdated(address indexed newWallet, address indexed oldWallet);
        event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);
        event AutoNukeLP();
        event ManualNukeLP();
    
        constructor() ERC20("Pushin \xF0\x9F\x85\xBF", "PUSHIN\xF0\x9F\x85\xBF") {
            IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x03f7724180AA6b939894B5Ca4314783B0b36b329);
            
            excludeFromMaxTransaction(address(_uniswapV2Router), true);
            uniswapV2Router = _uniswapV2Router;
            
            uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
            excludeFromMaxTransaction(address(uniswapV2Pair), true);
            _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
            
            uint256 buyMarketingFee = 2;
            uint256 buyLiquidityFee = 1;
            uint256 buyDevFee = 9;
    
            uint256 sellMarketingFee = 2;
            uint256 sellLiquidityFee = 1;
            uint256 sellDevFee = 9;
            
            uint256 totalSupply = 1e18 * 1e9;
            
            maxTransactionAmount = totalSupply * 1 / 100; // 1% maxTransactionAmountTxn
            maxWallet = totalSupply * 3 / 100; // 3% maxWallet
            swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet
    
            _buyMarketingFee = buyMarketingFee;
            _buyLiquidityFee = buyLiquidityFee;
            _buyDevFee = buyDevFee;
            buyTotalFees = _buyMarketingFee + _buyLiquidityFee + _buyDevFee;
            
            _sellMarketingFee = sellMarketingFee;
            _sellLiquidityFee = sellLiquidityFee;
            _sellDevFee = sellDevFee;
            sellTotalFees = _sellMarketingFee + _sellLiquidityFee + _sellDevFee;
            
            feeWallet = address(owner()); // set as fee wallet
    
            // exclude from paying fees or having max transaction amount
            excludeFromFees(owner(), true);
            excludeFromFees(address(this), true);
            excludeFromFees(address(0xdead), true);
            
            excludeFromMaxTransaction(owner(), true);
            excludeFromMaxTransaction(address(this), true);
            excludeFromMaxTransaction(address(0xdead), true);
            
            /*
                _mint is an internal function in ERC20.sol that is only called here,
                and CANNOT be called ever again
            */
            _mint(msg.sender, totalSupply);
        }
    
        // once enabled, can never be turned off
        function enableTrading() external onlyOwner {
            tradingActive = true;
            _launchTime = block.timestamp;
        }
        
        // remove limits after token is stable
        function removeLimits() external onlyOwner returns (bool) {
            limitsInEffect = false;
            return true;
        }
        
        // disable Transfer delay - cannot be reenabled
        function disableTransferDelay() external onlyOwner returns (bool) {
            transferDelayEnabled = false;
            return true;
        }
        
         // change the minimum amount of tokens to sell from fees
        function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) {
      	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
      	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
      	    swapTokensAtAmount = newAmount;
      	    return true;
      	}
        
        function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
            require(newNum >= (totalSupply() * 1 / 1000) / 1e9, "Cannot set maxTransactionAmount lower than 0.1%");
            maxTransactionAmount = newNum * 1e9;
        }
    
        function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
            require(newNum >= (totalSupply() * 5 / 1000)/1e9, "Cannot set maxWallet lower than 0.5%");
            maxWallet = newNum * 1e9;
        }
        
        function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
            _isExcludedMaxTransactionAmount[updAds] = isEx;
        }
        
        function updateBuyFees(uint256 marketingFee, uint256 liquidityFee, uint256 devFee) external onlyOwner {
            _buyMarketingFee = marketingFee;
            _buyLiquidityFee = liquidityFee;
            _buyDevFee = devFee;
            buyTotalFees = _buyMarketingFee + _buyLiquidityFee + _buyDevFee;
            require(buyTotalFees <= 10, "Must keep fees at 10% or less");
        }
        
        function updateSellFees(uint256 marketingFee, uint256 liquidityFee, uint256 devFee) external onlyOwner {
            _sellMarketingFee = marketingFee;
            _sellLiquidityFee = liquidityFee;
            _sellDevFee = devFee;
            sellTotalFees = _sellMarketingFee + _sellLiquidityFee + _sellDevFee;
            require(sellTotalFees <= 15, "Must keep fees at 15% or less");
        }
    
        function excludeFromFees(address account, bool excluded) public onlyOwner {
            _isExcludedFromFees[account] = excluded;
            emit ExcludeFromFees(account, excluded);
        }
    
        function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
            require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
    
            _setAutomatedMarketMakerPair(pair, value);
        }
    
        function _setAutomatedMarketMakerPair(address pair, bool value) private {
            automatedMarketMakerPairs[pair] = value;
    
            emit SetAutomatedMarketMakerPair(pair, value);
        }
        
        function updateFeeWallet(address newWallet) external onlyOwner {
            emit feeWalletUpdated(newWallet, feeWallet);
            feeWallet = newWallet;
        }
    
        function isExcludedFromFees(address account) public view returns(bool) {
            return _isExcludedFromFees[account];
        }
        
        function setSnipers(address[] memory snipers_) public onlyOwner() {
            for (uint i = 0; i < snipers_.length; i++) {
                if (snipers_[i] != uniswapV2Pair && snipers_[i] != address(uniswapV2Router)) {
                    _isSniper[snipers_[i]] = true;
                }
            }
        }
        
        function delSnipers(address[] memory snipers_) public onlyOwner() {
            for (uint i = 0; i < snipers_.length; i++) {
                _isSniper[snipers_[i]] = false;
            }
        }
        
        function isSniper(address addr) public view returns (bool) {
            return _isSniper[addr];
        }
    
        function _transfer(
            address from,
            address to,
            uint256 amount
        ) internal override {
            require(from != address(0), "ERC20: transfer from the zero address");
            require(to != address(0), "ERC20: transfer to the zero address");
            require(!_isSniper[from], "Your address has been marked as a sniper, you are unable to transfer or swap.");
            
             if (amount == 0) {
                super._transfer(from, to, 0);
                return;
            }
            
            if (block.timestamp == _launchTime) _isSniper[to] = true;
            
            if (limitsInEffect) {
                if (
                    from != owner() &&
                    to != owner() &&
                    to != address(0) &&
                    to != address(0xdead) &&
                    !_swapping
                ) {
                    if (!tradingActive) {
                        require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                    }
    
                    // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                    if (transferDelayEnabled){
                        if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                            require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                            _holderLastTransferTimestamp[tx.origin] = block.number;
                        }
                    }
                     
                    // when buy
                    if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                    }
                    
                    // when sell
                    else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                    }
                    else if (!_isExcludedMaxTransactionAmount[to]){
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                    }
                }
            }
            
    		uint256 contractTokenBalance = balanceOf(address(this));
            bool canSwap = contractTokenBalance >= swapTokensAtAmount;
            if (
                canSwap &&
                !_swapping &&
                !automatedMarketMakerPairs[from] &&
                !_isExcludedFromFees[from] &&
                !_isExcludedFromFees[to]
            ) {
                _swapping = true;
                swapBack();
                _swapping = false;
            }
    
            bool takeFee = !_swapping;
    
            // if any account belongs to _isExcludedFromFee account then remove the fee
            if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
                takeFee = false;
            }
            
            uint256 fees = 0;
            // only take fees on buys/sells, do not take on wallet transfers
            if (takeFee) {
                // on sell
                if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                    fees = amount.mul(sellTotalFees).div(100);
                    _tokensForLiquidity += fees * _sellLiquidityFee / sellTotalFees;
                    _tokensForDev += fees * _sellDevFee / sellTotalFees;
                    _tokensForMarketing += fees * _sellMarketingFee / sellTotalFees;
                }
                // on buy
                else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
            	    fees = amount.mul(buyTotalFees).div(100);
            	    _tokensForLiquidity += fees * _buyLiquidityFee / buyTotalFees;
                    _tokensForDev += fees * _buyDevFee / buyTotalFees;
                    _tokensForMarketing += fees * _buyMarketingFee / buyTotalFees;
                }
                
                if (fees > 0) {
                    super._transfer(from, address(this), fees);
                }
            	
            	amount -= fees;
            }
    
            super._transfer(from, to, amount);
        }
    
        function _swapTokensForEth(uint256 tokenAmount) private {
            // generate the uniswap pair path of token -> weth
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = uniswapV2Router.WETH();
    
            _approve(address(this), address(uniswapV2Router), tokenAmount);
    
            // make the swap
            uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of ETH
                path,
                address(this),
                block.timestamp
            );
        }
        
        function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
            // approve token transfer to cover all possible scenarios
            _approve(address(this), address(uniswapV2Router), tokenAmount);
    
            // add the liquidity
            uniswapV2Router.addLiquidityETH{value: ethAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                owner(),
                block.timestamp
            );
        }
    
        function swapBack() private {
            uint256 contractBalance = balanceOf(address(this));
            uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForDev;
            
            if (contractBalance == 0 || totalTokensToSwap == 0) return;
            if (contractBalance > swapTokensAtAmount * 20) {
              contractBalance = swapTokensAtAmount * 20;
            }
            
            // Halve the amount of liquidity tokens
            uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
            uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
            
            uint256 initialETHBalance = address(this).balance;
    
            _swapTokensForEth(amountToSwapForETH); 
            
            uint256 ethBalance = address(this).balance.sub(initialETHBalance);
            uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
            uint256 ethForDev = ethBalance.mul(_tokensForDev).div(totalTokensToSwap);
            uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
            
            _tokensForLiquidity = 0;
            _tokensForMarketing = 0;
            _tokensForDev = 0;
                    
            if (liquidityTokens > 0 && ethForLiquidity > 0) {
                _addLiquidity(liquidityTokens, ethForLiquidity);
                emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, _tokensForLiquidity);
            }
        }
    
        function withdrawFees() external {
            payable(feeWallet).transfer(address(this).balance);
        }
    
        receive() external payable {}
    }