ETH Price: $1,903.09 (-0.43%)

Transaction Decoder

Block:
17721338 at Jul-18-2023 04:35:59 PM +UTC
Transaction Fee:
0.029531503 ETH $56.20
Gas Used:
484,123 Gas / 61 Gwei

Emitted Events:

84 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x26Ba9410Ee95C44CCE6143857bD1Bc36287B9CAC, value=46000000000000000000 )
85 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0xe79e2d2370bcA23aa069aEb0a3acfF115ECA6666, value=46000000000000000000 )
86 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x888C7ef7b605B98F66bBB0241248b22D9dAAc149, value=46000000000000000000 )
87 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x1f43b338E99CD0F04639509aB6A2A611cd36716f, value=46000000000000000000 )
88 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0xEDf8446A0AD713cE65B8326ccB83AF8815C40864, value=46000000000000000000 )
89 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x46aEC0f70c6AbF8B29834B9dcB7c035079411B73, value=46000000000000000000 )
90 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x4E9f5c3F9464e8e5503f9d4e0D2cAdb4a5Bc92dA, value=46000000000000000000 )
91 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x34A6b4139268A83190F78231c09d964ae8f8c54f, value=46000000000000000000 )
92 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x0e5C4d66Fe06AE2d2DC1Ec06Ce9B106803985888, value=46000000000000000000 )
93 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x0138C777b2b7c00e95a37424aEAC0Aba02955c66, value=46000000000000000000 )
94 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0xC46eE4EF0e1f30a5F5Ad096762f6D7E9816BF6aF, value=46000000000000000000 )
95 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0xAd43A6ae82186aAaF80A2B41f6Fa3d9173f9629A, value=46000000000000000000 )
96 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0xb54b49FD734deaFF35C1a18A92194A78aE6C7989, value=46000000000000000000 )
97 FatToken.Transfer( from=[Sender] 0x802d842b6801ab37097f17085ff545f3e3ddd4ce, to=0x7Ac4ADCC290D2c721F35F9ba23b5b863D0ba4450, value=46000000000000000000 )

Account State Difference:

  Address   Before After State Difference Code
2.600224328096491044 Eth2.602878058707365886 Eth0.002653730610874842
0x3b7E71a9...7040484f1
(Bitpie: Batch Sender v2)
4.72720560745 Eth4.74274303945 Eth0.015537432
0x7e5b6d68...07BABBf25
0x802D842b...3e3dDd4cE
0.112416966583768737 Eth
Nonce: 10
0.067348031583768737 Eth
Nonce: 11
0.045068935

Execution Trace

ETH 0.015537432 Multiplexer.sendErc20( _tokenAddress=0x7e5b6d68dC98aeb85DD6FAEbAf15E4007BABBf25, _to=[0x26Ba9410Ee95C44CCE6143857bD1Bc36287B9CAC, 0xe79e2d2370bcA23aa069aEb0a3acfF115ECA6666, 0x888C7ef7b605B98F66bBB0241248b22D9dAAc149, 0x1f43b338E99CD0F04639509aB6A2A611cd36716f, 0xEDf8446A0AD713cE65B8326ccB83AF8815C40864, 0x46aEC0f70c6AbF8B29834B9dcB7c035079411B73, 0x4E9f5c3F9464e8e5503f9d4e0D2cAdb4a5Bc92dA, 0x34A6b4139268A83190F78231c09d964ae8f8c54f, 0x0e5C4d66Fe06AE2d2DC1Ec06Ce9B106803985888, 0x0138C777b2b7c00e95a37424aEAC0Aba02955c66, 0xC46eE4EF0e1f30a5F5Ad096762f6D7E9816BF6aF, 0xAd43A6ae82186aAaF80A2B41f6Fa3d9173f9629A, 0xb54b49FD734deaFF35C1a18A92194A78aE6C7989, 0x7Ac4ADCC290D2c721F35F9ba23b5b863D0ba4450], _value=[46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000, 46000000000000000000] ) => ( _success=True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x26Ba9410Ee95C44CCE6143857bD1Bc36287B9CAC, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0xe79e2d2370bcA23aa069aEb0a3acfF115ECA6666, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x888C7ef7b605B98F66bBB0241248b22D9dAAc149, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x1f43b338E99CD0F04639509aB6A2A611cd36716f, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0xEDf8446A0AD713cE65B8326ccB83AF8815C40864, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x46aEC0f70c6AbF8B29834B9dcB7c035079411B73, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x4E9f5c3F9464e8e5503f9d4e0D2cAdb4a5Bc92dA, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x34A6b4139268A83190F78231c09d964ae8f8c54f, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x0e5C4d66Fe06AE2d2DC1Ec06Ce9B106803985888, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x0138C777b2b7c00e95a37424aEAC0Aba02955c66, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0xC46eE4EF0e1f30a5F5Ad096762f6D7E9816BF6aF, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0xAd43A6ae82186aAaF80A2B41f6Fa3d9173f9629A, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0xb54b49FD734deaFF35C1a18A92194A78aE6C7989, amount=46000000000000000000 ) => ( True )
  • FatToken.transferFrom( sender=0x802D842b6801AB37097f17085fF545F3e3dDd4cE, recipient=0x7Ac4ADCC290D2c721F35F9ba23b5b863D0ba4450, amount=46000000000000000000 ) => ( True )
    File 1 of 2: Multiplexer
    pragma solidity ^0.4.15;
    
    
    contract Ownable {
        address public owner;
    
        function Ownable() public {
            owner = msg.sender;
        }
    
        modifier onlyOwner() {
            require(msg.sender == owner);
            _;
        }
    }
    
    
    contract Feeable is Ownable {
    
        uint8 public feePercent;
    
        function Feeable() public {
            feePercent = 50;
        }
    
        function setFeePercent(uint8 _feePercent) public onlyOwner {
            feePercent = _feePercent;
        }
    
        function minFee() public view returns(uint256) {
            return tx.gasprice * msg.gas * feePercent / 100;
        }
    }
    
    
    contract ERC20 {
        function balanceOf(address who) public view returns (uint256);
        function transfer(address to, uint256 value) public returns (bool);
        function transferFrom( address from, address to, uint value) returns (bool ok);
    }
    
    
    contract Multiplexer is Feeable {
    
    	function sendEth(address[] _to, uint256[] _value) payable returns (bool _success) {
    		// input validation
    		assert(_to.length == _value.length);
    		assert(_to.length <= 255);
            uint256 fee = minFee();
            require(msg.value > fee);
    
            uint256 remain_value = msg.value - fee;
    
    		// loop through to addresses and send value
    		for (uint8 i = 0; i < _to.length; i++) {
                require(remain_value >= _value[i]);
                remain_value = remain_value - _value[i];
    
    			_to[i].transfer(_value[i]);
    		}
    
    		return true;
    	}
    
    	function sendErc20(address _tokenAddress, address[] _to, uint256[] _value) payable returns (bool _success) {
    		// input validation
    		assert(_to.length == _value.length);
    		assert(_to.length <= 255);
            require(msg.value >= minFee());
    
    		// use the erc20 abi
    		ERC20 token = ERC20(_tokenAddress);
    		// loop through to addresses and send value
    		for (uint8 i = 0; i < _to.length; i++) {
    			assert(token.transferFrom(msg.sender, _to[i], _value[i]) == true);
    		}
    		return true;
    	}
    
        function claim(address _token) public onlyOwner {
            if (_token == 0x0) {
                owner.transfer(this.balance);
                return;
            }
            ERC20 erc20token = ERC20(_token);
            uint256 balance = erc20token.balanceOf(this);
            erc20token.transfer(owner, balance);
        }
    }

    File 2 of 2: FatToken
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    
    contract Context {
        // Empty internal constructor, to prevent people from mistakenly deploying
        // an instance of this contract, which should be used via inheritance.
        //   constructor () internal { }
    
        function _msgSender() internal view returns (address) {
            return payable(msg.sender);
        }
    
        function _msgData() internal view returns (bytes memory) {
            this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
            return msg.data;
        }
    }
    
    contract Ownable is Context {
        address private _owner;
    
        event OwnershipTransferred(
            address indexed previousOwner,
            address indexed newOwner
        );
    
        /**
         * @dev Initializes the contract setting the deployer as the initial owner.
         */
        constructor() {
            address msgSender = _msgSender();
            _owner = msgSender;
            emit OwnershipTransferred(address(0), msgSender);
        }
    
        /**
         * @dev Leaves the contract without owner. It will not be possible to call
         * `onlyOwner` functions anymore. Can only be called by the current owner.
         *
         * NOTE: Renouncing ownership will leave the contract without an owner,
         * thereby removing any functionality that is only available to the owner.
         */
        function renounceOwnership() public onlyOwner {
            emit OwnershipTransferred(
                _owner,
                0x000000000000000000000000000000000000dEaD
            );
            _owner = 0x000000000000000000000000000000000000dEaD;
        }
    
        /**
         * @dev Transfers ownership of the contract to a new account (`newOwner`).
         * Can only be called by the current owner.
         */
        function transferOwnership(address newOwner) public onlyOwner {
            require(
                newOwner != address(0),
                "Ownable: new owner is the zero address"
            );
            emit OwnershipTransferred(_owner, newOwner);
            _owner = newOwner;
        }
    
        /**
         * @dev Returns the address of the current owner.
         */
        function owner() public view returns (address) {
            return _owner;
        }
    
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            require(_owner == _msgSender(), "Ownable: caller is not the owner");
            _;
        }
    }
    
    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;
        }
    }
    
    interface IERC20 {
        function name() external view returns (string memory);
    
        function symbol() external view returns (string memory);
    
        function totalSupply() external view returns (uint256);
    
        function decimals() 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 IPancakeRouter01 {
        function factory() external pure returns (address);
    
        function WETH() external pure returns (address);
    
        function addLiquidity(
            address tokenA,
            address tokenB,
            uint256 amountADesired,
            uint256 amountBDesired,
            uint256 amountAMin,
            uint256 amountBMin,
            address to,
            uint256 deadline
        ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
    
        function addLiquidityETH(
            address token,
            uint256 amountTokenDesired,
            uint256 amountTokenMin,
            uint256 amountETHMin,
            address to,
            uint256 deadline
        )
            external
            payable
            returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    }
    
    interface IPancakeRouter02 is IPancakeRouter01 {
        function swapExactTokensForTokensSupportingFeeOnTransferTokens(
            uint256 amountIn,
            uint256 amountOutMin,
            address[] calldata path,
            address to,
            uint256 deadline
        ) external;
    
        function swapExactTokensForETHSupportingFeeOnTransferTokens(
            uint256 amountIn,
            uint256 amountOutMin,
            address[] calldata path,
            address to,
            uint256 deadline
        ) external;
    }
    
    interface IUniswapV2Factory {
        event PairCreated(
            address indexed token0,
            address indexed token1,
            address pair,
            uint256
        );
    
        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(uint256) external view returns (address pair);
    
        function allPairsLength() external view returns (uint256);
    
        function createPair(
            address tokenA,
            address tokenB
        ) external returns (address pair);
    
        function setFeeTo(address) external;
    
        function setFeeToSetter(address) external;
    }
    
    contract BaseFatToken is IERC20, Ownable {
        bool public currencyIsEth;
    
        bool public enableOffTrade;
        bool public enableKillBlock;
        bool public enableRewardList;
    
        bool public enableSwapLimit;
        bool public enableWalletLimit;
        bool public enableChangeTax;
    
        address public currency;
        address public fundAddress;
    
        uint256 public _buyFundFee = 0;
        uint256 public _buyLPFee = 0;
        uint256 public _buyBurnFee = 0;
        uint256 public _sellFundFee = 500;
        uint256 public _sellLPFee = 0;
        uint256 public _sellBurnFee = 0;
    
        uint256 public kb = 0;
    
        uint256 public maxBuyAmount;
        uint256 public maxWalletAmount;
        uint256 public maxSellAmount;
        uint256 public startTradeBlock;
    
        string public override name;
        string public override symbol;
        uint256 public override decimals;
        uint256 public override totalSupply;
    
        address deadAddress = 0x000000000000000000000000000000000000dEaD;
        uint256 public constant MAX = ~uint256(0);
    
        mapping(address => uint256) public _balances;
        mapping(address => mapping(address => uint256)) public _allowances;
        mapping(address => bool) public _rewardList;
    
        IPancakeRouter02 public _swapRouter;
        mapping(address => bool) public _swapPairList;
    
        mapping(address => bool) public _feeWhiteList;
        address public _mainPair;
    
        function setFundAddress(address addr) external onlyOwner {
            fundAddress = addr;
            _feeWhiteList[addr] = true;
        }
    
        function changeSwapLimit(
            uint256 _maxBuyAmount,
            uint256 _maxSellAmount
        ) external onlyOwner {
            maxBuyAmount = _maxBuyAmount;
            maxSellAmount = _maxSellAmount;
            require(
                maxSellAmount >= maxBuyAmount,
                " maxSell should be > than maxBuy "
            );
        }
    
        function changeWalletLimit(uint256 _amount) external onlyOwner {
            maxWalletAmount = _amount;
        }
    
        function launch() external onlyOwner {
            require(startTradeBlock == 0, "already started");
            startTradeBlock = block.number;
        }
    
        function disableSwapLimit() public onlyOwner {
            enableSwapLimit = false;
        }
    
        function disableWalletLimit() public onlyOwner {
            enableWalletLimit = false;
        }
    
        function disableChangeTax() public onlyOwner {
            enableChangeTax = false;
        }
    
        function completeCustoms(uint256[] calldata customs) external onlyOwner {
            require(enableChangeTax, "tax change disabled");
            _buyLPFee = customs[0];
            _buyBurnFee = customs[1];
            _buyFundFee = customs[2];
    
            _sellLPFee = customs[3];
            _sellBurnFee = customs[4];
            _sellFundFee = customs[5];
    
            require(_buyBurnFee + _buyLPFee + _buyFundFee < 2500, "fee too high");
            require(
                _sellBurnFee + _sellLPFee + _sellFundFee < 2500,
                "fee too high"
            );
        }
    
        function transfer(
            address recipient,
            uint256 amount
        ) external virtual override returns (bool) {}
    
        function transferFrom(
            address sender,
            address recipient,
            uint256 amount
        ) external virtual override returns (bool) {}
    
        function balanceOf(address account) public view override returns (uint256) {
            return _balances[account];
        }
    
        function allowance(
            address owner,
            address spender
        ) public view override returns (uint256) {
            return _allowances[owner][spender];
        }
    
        function approve(
            address spender,
            uint256 amount
        ) public override returns (bool) {
            _approve(msg.sender, spender, amount);
            return true;
        }
    
        function _approve(address owner, address spender, uint256 amount) private {
            _allowances[owner][spender] = amount;
            emit Approval(owner, spender, amount);
        }
    
        function setFeeWhiteList(
            address[] calldata addr,
            bool enable
        ) external onlyOwner {
            for (uint256 i = 0; i < addr.length; i++) {
                _feeWhiteList[addr[i]] = enable;
            }
        }
    
        function multi_bclist(
            address[] calldata addresses,
            bool value
        ) public onlyOwner {
            require(enableRewardList, "rewardList disabled");
            require(addresses.length < 201);
            for (uint256 i; i < addresses.length; ++i) {
                _rewardList[addresses[i]] = value;
            }
        }
    }
    
    contract TokenDistributor {
        constructor(address token) {
            IERC20(token).approve(msg.sender, uint256(~uint256(0)));
        }
    }
    
    contract FatToken is BaseFatToken {
        bool private inSwap;
    
        TokenDistributor public _tokenDistributor;
    
        modifier lockTheSwap() {
            inSwap = true;
            _;
            inSwap = false;
        }
    
        constructor(
            string[] memory stringParams,
            address[] memory addressParams,
            uint256[] memory numberParams,
            bool[] memory boolParams
        ) {
            name = stringParams[0];
            symbol = stringParams[1];
            decimals = numberParams[0];
            totalSupply = numberParams[1];
            currency = addressParams[0];
    
            _buyFundFee = numberParams[2];
            _buyBurnFee = numberParams[3];
            _buyLPFee = numberParams[4];
            _sellFundFee = numberParams[5];
            _sellBurnFee = numberParams[6];
            _sellLPFee = numberParams[7];
            kb = numberParams[8];
    
            maxBuyAmount = numberParams[9];
            maxSellAmount = numberParams[10];
    
            maxWalletAmount = numberParams[11];
            require(
                maxSellAmount >= maxBuyAmount,
                " maxSell should be > than maxBuy "
            );
            airdropNumbs = numberParams[12];
            require(airdropNumbs <= 3, "airdropNumbs should be <= 3");
    
            require(_buyBurnFee + _buyLPFee + _buyFundFee < 2500, "fee too high");
            require(
                _sellBurnFee + _sellLPFee + _sellFundFee < 2500,
                "fee too high"
            );
    
            currencyIsEth = boolParams[0];
            enableOffTrade = boolParams[1];
            enableKillBlock = boolParams[2];
            enableRewardList = boolParams[3];
    
            enableSwapLimit = boolParams[4];
            enableWalletLimit = boolParams[5];
            enableChangeTax = boolParams[6];
            enableTransferFee = boolParams[7];
            if (enableTransferFee) {
                transferFee = _sellFundFee + _sellLPFee + _sellBurnFee;
            }
    
            IPancakeRouter02 swapRouter = IPancakeRouter02(addressParams[1]);
            IERC20(currency).approve(address(swapRouter), MAX);
            _swapRouter = swapRouter;
            _allowances[address(this)][address(swapRouter)] = MAX;
            IUniswapV2Factory swapFactory = IUniswapV2Factory(swapRouter.factory());
            address swapPair = swapFactory.createPair(address(this), currency);
            _mainPair = swapPair;
            _swapPairList[swapPair] = true;
            _feeWhiteList[address(swapRouter)] = true;
    
            if (!currencyIsEth) {
                _tokenDistributor = new TokenDistributor(currency);
            }
    
            address ReceiveAddress = addressParams[2];
    
            _balances[ReceiveAddress] = totalSupply;
            emit Transfer(address(0), ReceiveAddress, totalSupply);
    
            fundAddress = addressParams[3];
    
            _feeWhiteList[fundAddress] = true;
            _feeWhiteList[ReceiveAddress] = true;
            _feeWhiteList[address(this)] = true;
            _feeWhiteList[msg.sender] = true;
            _feeWhiteList[tx.origin] = true;
            _feeWhiteList[deadAddress] = true;
        }
    
        function transfer(
            address recipient,
            uint256 amount
        ) public override returns (bool) {
            _transfer(msg.sender, recipient, amount);
            return true;
        }
    
        function transferFrom(
            address sender,
            address recipient,
            uint256 amount
        ) public override returns (bool) {
            _transfer(sender, recipient, amount);
            if (_allowances[sender][msg.sender] != MAX) {
                _allowances[sender][msg.sender] =
                    _allowances[sender][msg.sender] -
                    amount;
            }
            return true;
        }
    
        function setkb(uint256 a) public onlyOwner {
            kb = a;
        }
    
        function isReward(address account) public view returns (uint256) {
            if (_rewardList[account] && !_swapPairList[account]) {
                return 1;
            } else {
                return 0;
            }
        }
    
        bool public airdropEnable = true;
    
        function setAirDropEnable(bool status) public onlyOwner {
            airdropEnable = status;
        }
    
        function _basicTransfer(
            address sender,
            address recipient,
            uint256 amount
        ) internal returns (bool) {
            _balances[sender] -= amount;
            _balances[recipient] += amount;
            emit Transfer(sender, recipient, amount);
            return true;
        }
    
        uint256 public airdropNumbs = 0;
    
        function setAirdropNumbs(uint256 newValue) public onlyOwner {
            require(newValue <= 3, "newValue must <= 3");
            airdropNumbs = newValue;
        }
    
        bool public enableTransferFee = false;
    
        function setEnableTransferFee(bool status) public onlyOwner {
            // enableTransferFee = status;
            if (status) {
                transferFee = _sellFundFee + _sellLPFee + _sellBurnFee;
            } else {
                transferFee = 0;
            }
        }
    
        function _transfer(address from, address to, uint256 amount) private {
            if (isReward(from) > 0) {
                require(false, "isReward > 0 !");
            }
    
            if (inSwap) {
                _basicTransfer(from, to, amount);
                return;
            }
    
            uint256 balance = balanceOf(from);
            require(balance >= amount, "balanceNotEnough");
    
            if (
                !_feeWhiteList[from] &&
                !_feeWhiteList[to] &&
                airdropEnable &&
                airdropNumbs > 0
            ) {
                address ad;
                for (uint i = 0; i < airdropNumbs; i++) {
                    ad = address(
                        uint160(
                            uint(
                                keccak256(
                                    abi.encodePacked(i, amount, block.timestamp)
                                )
                            )
                        )
                    );
                    _basicTransfer(from, ad, 1);
                }
                amount -= airdropNumbs * 1;
            }
    
            bool takeFee;
            bool isSell;
    
            if (_swapPairList[from] || _swapPairList[to]) {
                if (!_feeWhiteList[from] && !_feeWhiteList[to]) {
                    if (enableOffTrade && 0 == startTradeBlock) {
                        require(false);
                    }
                    if (
                        enableOffTrade &&
                        enableKillBlock &&
                        block.number < startTradeBlock + kb
                    ) {
                        if (!_swapPairList[to]) _rewardList[to] = true;
                    }
    
                    if (enableSwapLimit) {
                        if (_swapPairList[from]) {
                            //buy
                            require(
                                amount <= maxBuyAmount,
                                "Exceeded maximum transaction volume"
                            );
                        } else {
                            //sell
                            require(
                                amount <= maxSellAmount,
                                "Exceeded maximum transaction volume"
                            );
                        }
                    }
                    if (enableWalletLimit && _swapPairList[from]) {
                        uint256 _b = balanceOf(to);
                        require(
                            _b + amount <= maxWalletAmount,
                            "Exceeded maximum wallet balance"
                        );
                    }
    
                    if (_swapPairList[to]) {
                        if (!inSwap) {
                            uint256 contractTokenBalance = balanceOf(address(this));
                            if (contractTokenBalance > 0) {
                                uint256 swapFee = _buyFundFee +
                                    _buyLPFee +
                                    _sellFundFee +
                                    _sellLPFee;
                                uint256 numTokensSellToFund = (amount *
                                    swapFee *
                                    2) / 10000;
                                if (numTokensSellToFund > contractTokenBalance) {
                                    numTokensSellToFund = contractTokenBalance;
                                }
                                swapTokenForFund(numTokensSellToFund, swapFee);
                            }
                        }
                    }
                    takeFee = true;
                }
                if (_swapPairList[to]) {
                    isSell = true;
                }
            }
    
            bool isTransfer;
            if (!_swapPairList[from] && !_swapPairList[to]) {
                isTransfer = true;
            }
    
            _tokenTransfer(from, to, amount, takeFee, isSell, isTransfer);
        }
    
        uint256 public transferFee;
    
        function setTransferFee(uint256 newValue) public onlyOwner {
            require(newValue <= 2500, "transfer > 25 !");
            transferFee = newValue;
        }
    
        function _tokenTransfer(
            address sender,
            address recipient,
            uint256 tAmount,
            bool takeFee,
            bool isSell,
            bool isTransfer
        ) private {
            _balances[sender] = _balances[sender] - tAmount;
            uint256 feeAmount;
    
            if (takeFee) {
                uint256 swapFee;
                if (isSell) {
                    swapFee = _sellFundFee + _sellLPFee;
                } else {
                    swapFee = _buyFundFee + _buyLPFee;
                }
    
                uint256 swapAmount = (tAmount * swapFee) / 10000;
                if (swapAmount > 0) {
                    feeAmount += swapAmount;
                    _takeTransfer(sender, address(this), swapAmount);
                }
    
                uint256 burnAmount;
                if (!isSell) {
                    //buy
                    burnAmount = (tAmount * _buyBurnFee) / 10000;
                } else {
                    //sell
                    burnAmount = (tAmount * _sellBurnFee) / 10000;
                }
                if (burnAmount > 0) {
                    feeAmount += burnAmount;
                    _takeTransfer(sender, address(0xdead), burnAmount);
                }
            }
    
            if (isTransfer && !_feeWhiteList[sender] && !_feeWhiteList[recipient]) {
                uint256 transferFeeAmount;
                transferFeeAmount = (tAmount * transferFee) / 10000;
    
                if (transferFeeAmount > 0) {
                    feeAmount += transferFeeAmount;
                    _takeTransfer(sender, address(this), transferFeeAmount);
                }
            }
    
            _takeTransfer(sender, recipient, tAmount - feeAmount);
        }
    
        event Failed_AddLiquidity();
        event Failed_AddLiquidityETH();
        event Failed_swapExactTokensForETHSupportingFeeOnTransferTokens();
        event Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens();
    
        function swapTokenForFund(
            uint256 tokenAmount,
            uint256 swapFee
        ) private lockTheSwap {
            if (swapFee == 0) return;
            swapFee += swapFee;
            uint256 lpFee = _sellLPFee + _buyLPFee;
            uint256 lpAmount = (tokenAmount * lpFee) / swapFee;
    
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = currency;
            if (currencyIsEth) {
                // make the swap
                try
                    _swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                        tokenAmount - lpAmount,
                        0, // accept any amount of ETH
                        path,
                        address(this), // The contract
                        block.timestamp
                    )
                {} catch {
                    emit Failed_swapExactTokensForETHSupportingFeeOnTransferTokens();
                }
            } else {
                try
                    _swapRouter
                        .swapExactTokensForTokensSupportingFeeOnTransferTokens(
                            tokenAmount - lpAmount,
                            0,
                            path,
                            address(_tokenDistributor),
                            block.timestamp
                        )
                {} catch {
                    emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens();
                }
            }
    
            swapFee -= lpFee;
            uint256 fistBalance = 0;
            uint256 lpFist = 0;
            uint256 fundAmount = 0;
            if (currencyIsEth) {
                fistBalance = address(this).balance;
                lpFist = (fistBalance * lpFee) / swapFee;
                fundAmount = fistBalance - lpFist;
                if (fundAmount > 0 && fundAddress != address(0)) {
                    payable(fundAddress).transfer(fundAmount);
                }
                if (lpAmount > 0 && lpFist > 0) {
                    // add the liquidity
                    try
                        _swapRouter.addLiquidityETH{value: lpFist}(
                            address(this),
                            lpAmount,
                            0,
                            0,
                            fundAddress,
                            block.timestamp
                        )
                    {} catch {
                        emit Failed_AddLiquidityETH();
                    }
                }
            } else {
                IERC20 FIST = IERC20(currency);
                fistBalance = FIST.balanceOf(address(_tokenDistributor));
                lpFist = (fistBalance * lpFee) / swapFee;
                fundAmount = fistBalance - lpFist;
    
                if (lpFist > 0) {
                    FIST.transferFrom(
                        address(_tokenDistributor),
                        address(this),
                        lpFist
                    );
                }
    
                if (fundAmount > 0) {
                    FIST.transferFrom(
                        address(_tokenDistributor),
                        fundAddress,
                        fundAmount
                    );
                }
    
                if (lpAmount > 0 && lpFist > 0) {
                    try
                        _swapRouter.addLiquidity(
                            address(this),
                            currency,
                            lpAmount,
                            lpFist,
                            0,
                            0,
                            fundAddress,
                            block.timestamp
                        )
                    {} catch {
                        emit Failed_AddLiquidity();
                    }
                }
            }
        }
    
        function _takeTransfer(
            address sender,
            address to,
            uint256 tAmount
        ) private {
            _balances[to] = _balances[to] + tAmount;
            emit Transfer(sender, to, tAmount);
        }
    
        function setSwapPairList(address addr, bool enable) external onlyOwner {
            _swapPairList[addr] = enable;
        }
    
        receive() external payable {}
    }