REMIX创造区块链智能合约

/**
 *Submitted for verification at BscScan.com on 2021-06-25
*/

pragma solidity 0.6.12;    
// SPDX-License-Identifier: Unlicensed    
interface IERC20 {    
    function totalSupply() external view returns (uint256);    
    /**    
     * @dev Returns the amount of tokens owned by `account`.    
     */    
    function balanceOf(address account) external view returns (uint256);    
    /**    
     * @dev Moves `amount` tokens from the caller's account to `recipient`.    
     *    
     * Returns a boolean value indicating whether the operation succeeded.    
     *    
     * Emits a {Transfer} event.    
     */    
    function transfer(address recipient, uint256 amount) external returns (bool);    
    /**    
     * @dev Returns the remaining number of tokens that `spender` will be    
     * allowed to spend on behalf of `owner` through {transferFrom}. This is    
     * zero by default.    
     *    
     * This value changes when {approve} or {transferFrom} are called.    
     */    
    function allowance(address owner, address spender) external view returns (uint256);    
    /**    
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.    
     *    
     * Returns a boolean value indicating whether the operation succeeded.    
     *    
     * IMPORTANT: Beware that changing an allowance with this method brings the risk    
     * that someone may use both the old and the new allowance by unfortunate    
     * transaction ordering. One possible solution to mitigate this race    
     * condition is to first reduce the spender's allowance to 0 and set the    
     * desired value afterwards:    
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729    
     *    
     * Emits an {Approval} event.    
     */    
    function approve(address spender, uint256 amount) external returns (bool);    
    /**    
     * @dev Moves `amount` tokens from `sender` to `recipient` using the    
     * allowance mechanism. `amount` is then deducted from the caller's    
     * allowance.    
     *    
     * Returns a boolean value indicating whether the operation succeeded.    
     *    
     * Emits a {Transfer} event.    
     */    
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);    
    /**    
     * @dev Emitted when `value` tokens are moved from one account (`from`) to    
     * another (`to`).    
     *    
     * Note that `value` may be zero.    
     */    
    event Transfer(address indexed from, address indexed to, uint256 value);    
    /**    
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by    
     * a call to {approve}. `value` is the new allowance.    
     */    
    event Approval(address indexed owner, address indexed spender, uint256 value);    
}    
/**    
 * @dev Wrappers over Solidity's arithmetic operations with added overflow    
 * checks.    
 *    
 * Arithmetic operations in Solidity wrap on overflow. This can easily result    
 * in bugs, because programmers usually assume that an overflow raises an    
 * error, which is the standard behavior in high level programming languages.    
 * `SafeMath` restores this intuition by reverting the transaction when an    
 * operation overflows.    
 *    
 * Using this library instead of the unchecked operations eliminates an entire    
 * class of bugs, so it's recommended to use it always.    
 */    
     
library SafeMath {    
    /**    
     * @dev Returns the addition of two unsigned integers, reverting on    
     * overflow.    
     *    
     * Counterpart to Solidity's `+` operator.    
     *    
     * Requirements:    
     *    
     * - Addition cannot overflow.    
     */    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {    
        uint256 c = a + b;    
        require(c >= a, "SafeMath: addition overflow");    
        return c;    
    }    
    /**    
     * @dev Returns the subtraction of two unsigned integers, reverting on    
     * overflow (when the result is negative).    
     *    
     * Counterpart to Solidity's `-` operator.    
     *    
     * Requirements:    
     *    
     * - Subtraction cannot overflow.    
     */    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {    
        return sub(a, b, "SafeMath: subtraction overflow");    
    }    
    /**    
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on    
     * overflow (when the result is negative).    
     *    
     * Counterpart to Solidity's `-` operator.    
     *    
     * Requirements:    
     *    
     * - Subtraction cannot overflow.    
     */    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {    
        require(b <= a, errorMessage);    
        uint256 c = a - b;    
        return c;    
    }    
    /**    
     * @dev Returns the multiplication of two unsigned integers, reverting on    
     * overflow.    
     *    
     * Counterpart to Solidity's `*` operator.    
     *    
     * Requirements:    
     *    
     * - Multiplication cannot overflow.    
     */    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {    
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the    
        // benefit is lost if 'b' is also tested.    
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522    
        if (a == 0) {    
            return 0;    
        }    
        uint256 c = a * b;    
        require(c / a == b, "SafeMath: multiplication overflow");    
        return c;    
    }    
    /**    
     * @dev Returns the integer division of two unsigned integers. Reverts on    
     * division by zero. The result is rounded towards zero.    
     *    
     * Counterpart to Solidity's `/` operator. Note: this function uses a    
     * `revert` opcode (which leaves remaining gas untouched) while Solidity    
     * uses an invalid opcode to revert (consuming all remaining gas).    
     *    
     * Requirements:    
     *    
     * - The divisor cannot be zero.    
     */    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {    
        return div(a, b, "SafeMath: division by zero");    
    }    
    /**    
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on    
     * division by zero. The result is rounded towards zero.    
     *    
     * Counterpart to Solidity's `/` operator. Note: this function uses a    
     * `revert` opcode (which leaves remaining gas untouched) while Solidity    
     * uses an invalid opcode to revert (consuming all remaining gas).    
     *    
     * Requirements:    
     *    
     * - The divisor cannot be zero.    
     */    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {    
        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;    
    }    
    /**    
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),    
     * Reverts when dividing by zero.    
     *    
     * Counterpart to Solidity's `%` operator. This function uses a `revert`    
     * opcode (which leaves remaining gas untouched) while Solidity uses an    
     * invalid opcode to revert (consuming all remaining gas).    
     *    
     * Requirements:    
     *    
     * - The divisor cannot be zero.    
     */    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {    
        return mod(a, b, "SafeMath: modulo by zero");    
    }    
    /**    
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),    
     * Reverts with custom message when dividing by zero.    
     *    
     * Counterpart to Solidity's `%` operator. This function uses a `revert`    
     * opcode (which leaves remaining gas untouched) while Solidity uses an    
     * invalid opcode to revert (consuming all remaining gas).    
     *    
     * Requirements:    
     *    
     * - The divisor cannot be zero.    
     */    
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {    
        require(b != 0, errorMessage);    
        return a % b;    
    }    
}    
abstract contract Context {    
    function _msgSender() internal view virtual returns (address payable) {    
        return msg.sender;    
    }    
    function _msgData() internal view virtual returns (bytes memory) {    
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691    
        return msg.data;    
    }    
}    
/**    
 * @dev Collection of functions related to the address type    
 */    
library Address {    
    /**    
     * @dev Returns true if `account` is a contract.    
     *    
     * [IMPORTANT]    
     * ====    
     * It is unsafe to assume that an address for which this function returns    
     * false is an externally-owned account (EOA) and not a contract.    
     *    
     * Among others, `isContract` will return false for the following    
     * types of addresses:    
     *    
     *  - an externally-owned account    
     *  - a contract in construction    
     *  - an address where a contract will be created    
     *  - an address where a contract lived, but was destroyed    
     * ====    
     */    
    function isContract(address account) internal view returns (bool) {    
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts    
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned    
        // for accounts without code, i.e. `keccak256('')`    
        bytes32 codehash;    
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;    
        // solhint-disable-next-line no-inline-assembly    
        assembly { codehash := extcodehash(account) }    
        return (codehash != accountHash && codehash != 0x0);    
    }    
    /**    
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to    
     * `recipient`, forwarding all available gas and reverting on errors.    
     *    
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost    
     * of certain opcodes, possibly making contracts go over the 2300 gas limit    
     * imposed by `transfer`, making them unable to receive funds via    
     * `transfer`. {sendValue} removes this limitation.    
     *    
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].    
     *    
     * IMPORTANT: because control is transferred to `recipient`, care must be    
     * taken to not create reentrancy vulnerabilities. Consider using    
     * {ReentrancyGuard} or the    
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].    
     */    
    function sendValue(address payable recipient, uint256 amount) internal {    
        require(address(this).balance >= amount, "Address: insufficient balance");    
        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value    
        (bool success, ) = recipient.call{ value: amount }("");    
        require(success, "Address: unable to send value, recipient may have reverted");    
    }    
    /**    
     * @dev Performs a Solidity function call using a low level `call`. A    
     * plain`call` is an unsafe replacement for a function call: use this    
     * function instead.    
     *    
     * If `target` reverts with a revert reason, it is bubbled up by this    
     * function (like regular Solidity function calls).    
     *    
     * Returns the raw returned data. To convert to the expected return value,    
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].    
     *    
     * Requirements:    
     *    
     * - `target` must be a contract.    
     * - calling `target` with `data` must not revert.    
     *    
     * _Available since v3.1._    
     */    
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {    
      return functionCall(target, data, "Address: low-level call failed");    
    }    
    /**    
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with    
     * `errorMessage` as a fallback revert reason when `target` reverts.    
     *    
     * _Available since v3.1._    
     */    
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {    
        return _functionCallWithValue(target, data, 0, errorMessage);    
    }    
    /**    
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],    
     * but also transferring `value` wei to `target`.    
     *    
     * Requirements:    
     *    
     * - the calling contract must have an ETH balance of at least `value`.    
     * - the called Solidity function must be `payable`.    
     *    
     * _Available since v3.1._    
     */    
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {    
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");    
    }    
    /**    
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but    
     * with `errorMessage` as a fallback revert reason when `target` reverts.    
     *    
     * _Available since v3.1._    
     */    
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {    
        require(address(this).balance >= value, "Address: insufficient balance for call");    
        return _functionCallWithValue(target, data, value, errorMessage);    
    }    
    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {    
        require(isContract(target), "Address: call to non-contract");    
        // solhint-disable-next-line avoid-low-level-calls    
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);    
        if (success) {    
            return returndata;    
        } else {    
            // Look for revert reason and bubble it up if present    
            if (returndata.length > 0) {    
                // The easiest way to bubble the revert reason is using memory via assembly    
                // solhint-disable-next-line no-inline-assembly    
                assembly {    
                    let returndata_size := mload(returndata)    
                    revert(add(32, returndata), returndata_size)    
                }    
            } else {    
                revert(errorMessage);    
            }    
        }    
    }    
}    
/**    
 * @dev Contract module which provides a basic access control mechanism, where    
 * there is an account (an owner) that can be granted exclusive access to    
 * specific functions.    
 *    
 * By default, the owner account will be the one that deploys the contract. This    
 * can later be changed with {transferOwnership}.    
 *    
 * This module is used through inheritance. It will make available the modifier    
 * `onlyOwner`, which can be applied to your functions to restrict their use to    
 * the owner.    
 */    
contract Ownable is Context {    
    address private _owner;    
    address private _previousOwner;    
    uint256 private _lockTime;    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);    
    /**    
     * @dev Initializes the contract setting the deployer as the initial owner.    
     */    
    constructor () internal {    
        address msgSender = _msgSender();    
        _owner = msgSender;    
        emit OwnershipTransferred(address(0), msgSender);    
    }    
    /**    
     * @dev Returns the address of the current owner.    
     */    
    function owner() public view returns (address) {    
        return _owner;    
    }    
    /**    
     * @dev Throws if called by any account other than the owner.    
     */    
    modifier onlyOwner() {    
        require(_owner == _msgSender(), "Ownable: caller is not the owner");    
        _;    
    }    
     /**    
     * @dev Leaves the contract without owner. It will not be possible to call    
     * `onlyOwner` functions anymore. Can only be called by the current owner.    
     *    
     * NOTE: Renouncing ownership will leave the contract without an owner,    
     * thereby removing any functionality that is only available to the owner.    
     */    
    function renounceOwnership() external virtual onlyOwner {    
        emit OwnershipTransferred(_owner, address(0));    
        _owner = address(0);    
    }    
    /**    
     * @dev Transfers ownership of the contract to a new account (`newOwner`).    
     * Can only be called by the current owner.    
     */    
    function transferOwnership(address newOwner) external virtual onlyOwner {    
        require(newOwner != address(0), "Ownable: new owner is the zero address");    
        emit OwnershipTransferred(_owner, newOwner);    
        _owner = newOwner;    
    }    
    function getUnlockTime() external view returns (uint256) {    
        return _lockTime;    
    }    
    function getTime() external view returns (uint256) {undefined
        return now;
    }
    //Locks the contract for owner for the amount of time provided    
    function lock(uint256 time) external virtual onlyOwner {    
        _previousOwner = _owner;    
        _owner = address(0);    
        _lockTime = now + time;    
        emit OwnershipTransferred(_owner, address(0));    
    }    
        
    //Unlocks the contract for owner when _lockTime is exceeds    
    function unlock() external virtual {    
        require(_previousOwner == msg.sender, "You don't have permission to unlock");    
        require(now > _lockTime , "Contract is locked until 7 days");    
        emit OwnershipTransferred(_owner, _previousOwner);    
        _owner = _previousOwner;    
    }    
}    
// pragma solidity >=0.5.0;    
interface IPancakeswapV2Factory {    
    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;    
}    
// pragma solidity >=0.5.0;    
interface IPancakeswapV2Pair {    
    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;    
}    
// pragma solidity >=0.6.2;    
interface IPancakeswapV2Router01 {    
    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);    
}    
// pragma solidity >=0.6.2;    
interface IPancakeswapV2Router02 is IPancakeswapV2Router01 {    
    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 BraveSoha is Context, IERC20, Ownable {    
    using SafeMath for uint256;    
    using Address for address;    
    mapping (address => uint256) private _rOwned;    
    mapping (address => uint256) private _tOwned;    
    mapping (address => mapping (address => uint256)) private _allowances;    
    mapping (address => bool) private _isExcludedFromFee;    
    mapping (address => bool) private _isExcluded;    
        
    mapping(address=>bool) private _isExcludedFromFundFee;    
    address[] private _excluded;    
       
    uint256 private constant MAX = ~uint256(0);    
    uint256 private constant _tTotal = 10000000000000 * 10**6;    
    uint256 private _rTotal = (MAX - (MAX % _tTotal));    
    uint256 private _tFeeTotal;    
    string private constant _name = "Floki";    
    string private constant _symbol = "Floki";    
    uint8 private constant _decimals = 6;    
        
    uint256 public _fundFee = 0;    
    uint256 private _previousFundFee = _fundFee;    
        
    address public _fundWallet = _msgSender();    
    address public _previousFundWallet = _fundWallet;    
        
    uint256 public _shareFee = 0;    
    uint256 private _previousTaxFee = _shareFee;    
        
    uint256 public _liquidityFee = 0;    
    uint256 private _previousLiquidityFee = _liquidityFee;    
    IPancakeswapV2Router02 public immutable pancakeswapV2Router;    
    address public immutable pancakeswapV2Pair;    
    address public pancakeswapRouterAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;   // it's pointing to Mainnet
        
    bool inSwapAndLiquify;    
    bool public swapAndLiquifyEnabled = false;    
        
    uint256 public _maxTxAmount = 10000000000000 * 10**6;    
    // Fixed this so ratio is between _tTotal and numTokensSellToAddToLiquidity
    // is 1 / 2000 like in OG SAFEMOON.
    // This way only 0.025% of total supply is sold at each swapAndLiquify event and not 5% lmao.
    uint256 private numTokensSellToAddToLiquidity = 250000000 * 10**9;  
        
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);    
    event SwapAndLiquifyEnabledUpdated(bool enabled);    
    event SwapAndLiquify(    
        uint256 tokensSwapped,    
        uint256 ethReceived,    
        uint256 tokensIntoLiquidity    
    );    
    event ExcludeFromReward(address);    
    event IncludeInReward(address);    
    event ExcludeFromLiquidityFee(address);    
    event IncludeInLiquidityFee(address);    
    event TaxFeeUpdated(uint256,uint256);    
    event LiquidityFeeUpdated(uint256,uint256);    
    event FundFee(uint256,uint256);    
    event OwnerTaxAccountUpdated(address,address);    
    event ExcludedFromFundFee(address);    
    event IncludedInFundFee(address);
    event newPancakeswapRouterAddress(address);
        
    modifier lockTheSwap {    
        inSwapAndLiquify = true;    
        _;    
        inSwapAndLiquify = false;    
    }    
        
    constructor() public {    
        _rOwned[_msgSender()] = _rTotal;    
            
            
        //Mainnet :0x10ED43C718714eb63d5aA57B78B54704E256024E    
        //Testnet: 0xD99D1c33F9fC3444f8101754aBC46c52416550D1    
        IPancakeswapV2Router02 _pancakeswapV2Router = IPancakeswapV2Router02(pancakeswapRouterAddress);    
         // Create a pancakeswap pair for this new token    
        pancakeswapV2Pair = IPancakeswapV2Factory(_pancakeswapV2Router.factory())    
            .createPair(address(this), _pancakeswapV2Router.WETH());    
        // set the rest of the contract variables    
        pancakeswapV2Router = _pancakeswapV2Router;    
            
        //exclude owner and this contract from fee    
        _isExcludedFromFee[owner()] = true;    
        _isExcludedFromFee[address(this)] = true;    
            
        //exclude owner and this contract from fee    
        _isExcludedFromFundFee[owner()] = true;    
        _isExcludedFromFundFee[address(this)] = true;    
            
        emit Transfer(address(0), _msgSender(), _tTotal);    
    }    
    function name() external pure returns (string memory) {    
        return _name;    
    }    
    function symbol() external pure returns (string memory) {    
        return _symbol;    
    }    
    function decimals() external pure returns (uint8) {    
        return _decimals;    
    }    
    function totalSupply() external view override returns (uint256) {    
        return _tTotal;    
    }    
    function balanceOf(address account) public view override returns (uint256) {    
        if (_isExcluded[account]) return _tOwned[account];    
        return tokenFromReflection(_rOwned[account]);    
    }    
    function transfer(address recipient, uint256 amount) external override returns (bool) {    
        _transfer(_msgSender(), recipient, amount);    
        return true;    
    }    
    function allowance(address owner, address spender) external view override returns (uint256) {    
        return _allowances[owner][spender];    
    }    
    function approve(address spender, uint256 amount) external override returns (bool) {    
        _approve(_msgSender(), spender, amount);    
        return true;    
    }    
    function transferFrom(address sender, address recipient, uint256 amount) external 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) external virtual returns (bool) {    
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));    
        return true;    
    }    
    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) {    
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));    
        return true;    
    }    
    function isExcludedFromReward(address account) external view returns (bool) {    
        return _isExcluded[account];    
    }    
    function totalFees() external view returns (uint256) {    
        return _tFeeTotal;    
    }    
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {    
        require(tAmount <= _tTotal, "Amount must be less than supply");    
        if (!deductTransferFee) {    
            (uint256 rAmount,,,,,) = _getValues(tAmount);    
            return rAmount;    
        } else {    
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);    
            return rTransferAmount;    
        }    
    }    
    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {    
        require(rAmount <= _rTotal, "Amount must be less than total reflections");    
        uint256 currentRate =  _getRate();    
        return rAmount.div(currentRate);    
    }    
       
    function excludeFromReward(address account) external onlyOwner() {    
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Pancakeswap router.');    
        require(!_isExcluded[account], "Account is not excluded");    
        if(_rOwned[account] > 0) {    
            _tOwned[account] = tokenFromReflection(_rOwned[account]);    
        }    
        _isExcluded[account] = true;    
        _excluded.push(account);    
            
        emit ExcludeFromReward(account);    
    }    
    function includeInReward(address account) external onlyOwner() {    
        require(_isExcluded[account], "Account is not excluded");    
        for (uint256 i = 0; i < _excluded.length; i++) {    
            if (_excluded[i] == account) {    
                _excluded[i] = _excluded[_excluded.length - 1];    
                _tOwned[account] = 0;    
                _isExcluded[account] = false;    
                _excluded.pop();    
                break;    
            }    
        }    
            
        emit IncludeInReward(account);    
    }    
        function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {    
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);    
        _tOwned[sender] = _tOwned[sender].sub(tAmount);    
        _rOwned[sender] = _rOwned[sender].sub(rAmount);    
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);    
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);            
        _takeLiquidity(tLiquidity);    
        _reflectFee(rFee, tFee);    
        emit Transfer(sender, recipient, tTransferAmount);    
    }    
        
    function excludeFromLiquidityFee(address account) external onlyOwner {    
        _isExcludedFromFee[account] = true;    
        emit ExcludeFromLiquidityFee(account);    
    }    
        
        
    function includeInLiquidityFee(address account) external onlyOwner {    
         require( _isExcludedFromFee[account], "Account is not excluded From liquidityFee");    
        _isExcludedFromFee[account] = false;    
        emit IncludeInLiquidityFee(account);    
    }    
        
   function excludedFromFundFee(address account) external onlyOwner {    
        _isExcludedFromFundFee[account] = true;    
        emit ExcludedFromFundFee(account);    
    }    
        
    function includeInFundFee(address account) external onlyOwner{    
         require( _isExcludedFromFundFee[account], "Account is not excluded From FundFee");    
        _isExcludedFromFundFee[account] = false;    
        emit IncludedInFundFee(account);    
            
    }    
        
        
       
    function setShareFeePercent(uint256 taxFee) external onlyOwner() {    
        _previousTaxFee = _shareFee;    
        _shareFee = taxFee;    
        emit TaxFeeUpdated(_previousTaxFee,_shareFee);    
    }    
        
    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {    
        _previousLiquidityFee = _liquidityFee;    
        _liquidityFee = liquidityFee;    
            
        emit LiquidityFeeUpdated(_previousLiquidityFee,_liquidityFee);    
    }    
       
    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {undefined
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(
            10000
        );
    }    
        
    function setFundFeePercent(uint256 _fundFeePercent) external onlyOwner() {    
        _previousFundFee = _fundFee;    
        _fundFee = _fundFeePercent;    
        emit FundFee(_previousFundFee,_fundFee);    
    }    
        
        
    function setOwnerTaxAccount(address _account) external onlyOwner() {    
        _previousFundWallet = _fundWallet;    
        _fundWallet = _account;    
            
        emit OwnerTaxAccountUpdated(_previousFundWallet,_fundWallet);    
    }    
        
        
        
    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {    
        swapAndLiquifyEnabled = _enabled;    
        emit SwapAndLiquifyEnabledUpdated(_enabled);    
    }    
        
     //to receive ETH from pancakeswapV2Router when swapping    
    receive() external payable {}    
        
        
        
         function withdraw() external onlyOwner {    
         msg.sender.transfer(address(this).balance);    
     }    
        
        
    function _reflectFee(uint256 rFee, uint256 tFee) private {    
        _rTotal = _rTotal.sub(rFee);    
        _tFeeTotal = _tFeeTotal.add(tFee);    
    }    
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {    
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);    
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());    
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);    
    }    
    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {    
        uint256 tFee = calculateTaxFee(tAmount);    
        uint256 tLiquidity = calculateLiquidityFee(tAmount);    
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);    
        return (tTransferAmount, tFee, tLiquidity);    
    }    
    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {    
        uint256 rAmount = tAmount.mul(currentRate);    
        uint256 rFee = tFee.mul(currentRate);    
        uint256 rLiquidity = tLiquidity.mul(currentRate);    
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);    
        return (rAmount, rTransferAmount, rFee);    
    }    
    function _getRate() private view returns(uint256) {    
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();    
        return rSupply.div(tSupply);    
    }    
    function _getCurrentSupply() private view returns(uint256, uint256) {    
        uint256 rSupply = _rTotal;    
        uint256 tSupply = _tTotal;          
        for (uint256 i = 0; i < _excluded.length; i++) {    
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);    
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);    
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);    
        }    
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);    
        return (rSupply, tSupply);    
    }    
        
    function _takeLiquidity(uint256 tLiquidity) private {    
        uint256 currentRate =  _getRate();    
        uint256 rLiquidity = tLiquidity.mul(currentRate);    
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);    
        if(_isExcluded[address(this)])    
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);    
    }    
        
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {    
        return _amount.mul(_shareFee).div(    
            10**2    
        );    
    }    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {    
        return _amount.mul(_liquidityFee).div(    
            10**2    
        );    
    }    
        
    function removeAllFee() private {    
        if(_shareFee == 0 && _liquidityFee == 0) return;    
            
        _previousTaxFee = _shareFee;    
        _previousLiquidityFee = _liquidityFee;    
            
        _shareFee = 0;    
        _liquidityFee = 0;    
    }    
        
    function restoreAllFee() private {    
        _shareFee = _previousTaxFee;    
        _liquidityFee = _previousLiquidityFee;    
    }    
        
    function isExcludedFromFee(address account) external view returns(bool) {    
        return _isExcludedFromFee[account];    
    }    
    function _approve(address owner, address spender, uint256 amount) private {    
        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 _transfer(    
        address from,    
        address to,    
        uint256 amount    
    ) private {    
        require(from != address(0), "ERC20: transfer from the zero address");    
        require(to != address(0), "ERC20: transfer to the zero address");    
        require(amount > 0, "Transfer amount must be greater than zero");    
        if(from != owner() && to != owner())    
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");    
                
                
                
                
            
            
        // is the token balance of this contract address over the min number of    
        // tokens that we need to initiate a swap + liquidity lock?    
        // also, don't get caught in a circular liquidity event.    
        // also, don't swap & liquify if sender is pancakeswap pair.    
        uint256 contractTokenBalance = balanceOf(address(this));    
            
        if(contractTokenBalance >= _maxTxAmount)    
        {    
            contractTokenBalance = _maxTxAmount;    
        }    
            
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;    
        if (    
            overMinTokenBalance &&    
            !inSwapAndLiquify &&    
            from != pancakeswapV2Pair &&    
            swapAndLiquifyEnabled    
        ) {    
            contractTokenBalance = numTokensSellToAddToLiquidity;    
            //add liquidity    
            swapAndLiquify(contractTokenBalance);    
        }    
            
        //indicates if fee should be deducted from transfer    
        bool takeFee = true;    
            
        //if any account belongs to _isExcludedFromFee account then remove the fee    
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){    
            takeFee = false;    
        }    
            
            
        if(_isExcludedFromFundFee[from]){    
          _tokenTransfer(from,to,amount,takeFee);      
                    
        }else {    
                
         //send 1% to owner     
        uint256 _amountSentToOwner = amount.mul(_fundFee).div(10**2);    
        uint256 _remainingAmount =  amount.sub(_amountSentToOwner);    
                
        _tokenTransfer(from,_fundWallet,_amountSentToOwner,takeFee);    
        //transfer amount, it will take tax, burn, liquidity fee    
        _tokenTransfer(from,to,_remainingAmount,takeFee);    
                
        }    
            
            
            
    }    
    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {    
        // split the contract balance into halves    
        uint256 half = contractTokenBalance.div(2);    
        uint256 otherHalf = contractTokenBalance.sub(half);    
        // capture the contract's current ETH balance.    
        // this is so that we can capture exactly the amount of ETH that the    
        // swap creates, and not make the liquidity event include any ETH that    
        // has been manually sent to the contract    
        uint256 initialBalance = address(this).balance;    
        // swap tokens for ETH    
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered    
        // how much ETH did we just swap into?    
        uint256 newBalance = address(this).balance.sub(initialBalance);    
        // add liquidity to pancakeswap    
        addLiquidity(otherHalf, newBalance);    
            
        emit SwapAndLiquify(half, newBalance, otherHalf);    
    }    
    function swapTokensForEth(uint256 tokenAmount) private {    
        // generate the pancakeswap pair path of token -> weth    
        address[] memory path = new address[](2);    
        path[0] = address(this);    
        path[1] = pancakeswapV2Router.WETH();    
        _approve(address(this), address(pancakeswapV2Router), tokenAmount);    
        // make the swap    
        pancakeswapV2Router.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(pancakeswapV2Router), tokenAmount);    
        // add the liquidity    
        pancakeswapV2Router.addLiquidityETH{value: ethAmount}(    
            address(this),    
            tokenAmount,    
            0, // slippage is unavoidable    
            0, // slippage is unavoidable    
            owner(),    
            block.timestamp    
        );    
    }    
    //this method is responsible for taking all fee, if takeFee is true    
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {    
        if(!takeFee)    
            removeAllFee();    
            
        if (_isExcluded[sender] && !_isExcluded[recipient]) {    
            _transferFromExcluded(sender, recipient, amount);    
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {    
            _transferToExcluded(sender, recipient, amount);    
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {    
            _transferBothExcluded(sender, recipient, amount);    
        } else {    
            _transferStandard(sender, recipient, amount);    
        }    
            
        if(!takeFee)    
            restoreAllFee();    
    }    
    function _transferStandard(address sender, address recipient, uint256 tAmount) private {    
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);    
        _rOwned[sender] = _rOwned[sender].sub(rAmount);    
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);    
        _takeLiquidity(tLiquidity);    
        _reflectFee(rFee, tFee);    
        emit Transfer(sender, recipient, tTransferAmount);    
    }    
    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {    
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);    
        _rOwned[sender] = _rOwned[sender].sub(rAmount);    
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);    
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);               
        _takeLiquidity(tLiquidity);    
        _reflectFee(rFee, tFee);    
        emit Transfer(sender, recipient, tTransferAmount);    
    }    
    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {    
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);    
        _tOwned[sender] = _tOwned[sender].sub(tAmount);    
        _rOwned[sender] = _rOwned[sender].sub(rAmount);    
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);       
        _takeLiquidity(tLiquidity);    
        _reflectFee(rFee, tFee);    
        emit Transfer(sender, recipient, tTransferAmount);    
    }
    
    function setPancakeSwapRouterAddress(address _newRouterAddress) external onlyOwner {undefined
        
        pancakeswapRouterAddress = _newRouterAddress;
        
        emit newPancakeswapRouterAddress(_newRouterAddress);
        
        
    }
    
        
}
 

你可能感兴趣的:(智能合约)