# $DCAP

/\*\* \*Submitted for verification at BscScan.com on 2021-12-17 \*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

/\*\*

* @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /*\*

  * @dev Returns the amount of tokens in existence. \*/ 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 Interface for the optional metadata functions from the ERC20 standard.
*
* *Available since v4.1.* */ interface IERC20Metadata is IERC20 { /*\*

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

  /\*\*

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

  /\*\*

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

/\*

* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts. \*/ abstract contract Context { function \_msgSender() internal view virtual returns (address) { return msg.sender; }

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

/\*\*

* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {\_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* <https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226\\[How>
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}. \*/ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private \_balances;

  mapping(address => mapping(address => uint256)) private \_allowances;

  uint256 private \_totalSupply;

  string private \_name; string private \_symbol;

  /\*\*

  * @dev Sets the values for {name} and {symbol}.
  *
  * The default value of {decimals} is 18. To select a different value for
  * {decimals} you should overload it.
  *
  * All two of these values are immutable: they can only be set once during
  * construction. \*/ constructor(string memory name\_, string memory symbol\_) { *name = name*; *symbol = symbol*; }

  /\*\*

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

  /\*\*

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

  /\*\*

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

  /\*\*

  * @dev See {IERC20-totalSupply}. \*/ function totalSupply() public view virtual override returns (uint256) { return \_totalSupply; }

  /\*\*

  * @dev See {IERC20-balanceOf}. \*/ function balanceOf(address account) public view virtual override returns (uint256) { return \_balances\[account]; }

  /\*\*

  * @dev See {IERC20-transfer}.
  *
  * Requirements:
  *
  * * `recipient` cannot be the zero address.
  * * the caller must have a balance of at least `amount`. \*/ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { \_transfer(\_msgSender(), recipient, amount); return true; }

  /\*\*

  * @dev See {IERC20-allowance}. \*/ function allowance(address owner, address spender) public view virtual override returns (uint256) { return \_allowances\[owner]\[spender]; }

  /\*\*

  * @dev See {IERC20-approve}.
  *
  * Requirements:
  *
  * * `spender` cannot be the zero address. \*/ function approve(address spender, uint256 amount) public virtual override returns (bool) { \_approve(\_msgSender(), spender, amount); return true; }

  /\*\*

  * @dev See {IERC20-transferFrom}.
  *
  * Emits an {Approval} event indicating the updated allowance. This is not
  * required by the EIP. See the note at the beginning of {ERC20}.
  *
  * Requirements:
  *
  * * `sender` and `recipient` cannot be the zero address.
  * * `sender` must have a balance of at least `amount`.
  * * the caller must have allowance for `sender`'s tokens of at least
  * `amount`. \*/ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { \_transfer(sender, recipient, amount);

    uint256 currentAllowance = \_allowances\[sender]\[\_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { \_approve(sender, \_msgSender(), currentAllowance - amount); }

    return true; }

  /\*\*

  * @dev Atomically increases the allowance granted to `spender` by the caller.
  *
  * This is an alternative to {approve} that can be used as a mitigation for
  * problems described in {IERC20-approve}.
  *
  * Emits an {Approval} event indicating the updated allowance.
  *
  * Requirements:
  *
  * * `spender` cannot be the zero address. \*/ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { \_approve(\_msgSender(), spender, \_allowances\[\_msgSender()]\[spender] + addedValue); return true; }

  /\*\*

  * @dev Atomically decreases the allowance granted to `spender` by the caller.
  *
  * This is an alternative to {approve} that can be used as a mitigation for
  * problems described in {IERC20-approve}.
  *
  * Emits an {Approval} event indicating the updated allowance.
  *
  * Requirements:
  *
  * * `spender` cannot be the zero address.
  * * `spender` must have allowance for the caller of at least
  * `subtractedValue`. \*/ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = \_allowances\[\_msgSender()]\[spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { \_approve(\_msgSender(), spender, currentAllowance - subtractedValue); }

    return true; }

  /\*\*

  * @dev Moves `amount` of tokens from `sender` to `recipient`.
  *
  * This internal function is equivalent to {transfer}, and can be used to
  * e.g. implement automatic token fees, slashing mechanisms, etc.
  *
  * Emits a {Transfer} event.
  *
  * Requirements:
  *
  * * `sender` cannot be the zero address.
  * * `recipient` cannot be the zero address.
  *

  ```
  * `sender` must have a balance of at least `amount`. \*/ 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);

  uint256 senderBalance = \_balances\[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { \_balances\[sender] = senderBalance - amount; } \_balances\[recipient] += amount;

  emit Transfer(sender, recipient, amount);

  \_afterTokenTransfer(sender, recipient, amount); }
  ```

  /\*\* @dev Creates `amount` tokens and assigns them to `account`, increasing

  * the total supply.
  *
  * Emits a {Transfer} event with `from` set to the zero address.
  *
  * Requirements:
  *
  *

  ```
  * `account` cannot be the zero address. \*/ function \_mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address");
  ```

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

  \_totalSupply += amount; \_balances\[account] += amount; emit Transfer(address(0), account, amount);

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

  /\*\*

  * @dev Destroys `amount` tokens from `account`, reducing the
  * total supply.
  *
  * Emits a {Transfer} event with `to` set to the zero address.
  *
  * Requirements:
  *
  * * `account` cannot be the zero address.
  *

  ```
  * `account` must have at least `amount` tokens. \*/ function \_burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address");
  ```

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

  uint256 accountBalance = \_balances\[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { \_balances\[account] = accountBalance - amount; } \_totalSupply -= amount;

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

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

  /\*\*

  * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
  *
  * This internal function is equivalent to `approve`, and can be used to
  * e.g. set automatic allowances for certain subsystems, etc.
  *
  * Emits an {Approval} event.
  *
  * Requirements:
  *
  * * `owner` cannot be the zero address.
  *

  ```
  * `spender` cannot be the zero address. \*/ function \_approve( address owner, address spender, uint256 amount ) internal virtual { 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); }
  ```

  /\*\*

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

  /\*\*

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

/\*\*

* @dev 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. \*/ abstract 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() { }

  /\*\*

  * @dev Returns the address of the current owner. \*/ function owner() public view virtual 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() public virtual onlyOwner { \_setOwner(address(0)); }

  /\*\*

  * @dev Transfers ownership of the contract to a new account (`newOwner`).
  * Can only be called by the current owner. \*/ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); \_setOwner(newOwner); }

  function \_setOwner(address newOwner) internal { address oldOwner = \_owner; \_owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }

/\*\*

* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /*\*

  * @dev Emitted when the pause is triggered by `account`. \*/ event Paused(address account);

  /\*\*

  * @dev Emitted when the pause is lifted by `account`. \*/ event Unpaused(address account);

  bool private \_paused;

  /\*\*

  * @dev Initializes the contract in unpaused state. \*/ constructor() { \_paused = false; }

  /\*\*

  * @dev Returns true if the contract is paused, and false otherwise. \*/ function paused() public view virtual returns (bool) { return \_paused; }

  /\*\*

  * @dev Modifier to make a function callable only when the contract is not paused.
  *
  * Requirements:
  *
  * * The contract must not be paused. \*/ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); \_; }

  /\*\*

  * @dev Modifier to make a function callable only when the contract is paused.
  *
  * Requirements:
  *
  * * The contract must be paused. \*/ modifier whenPaused() { require(paused(), "Pausable: not paused"); \_; }

  /\*\*

  * @dev Triggers stopped state.
  *
  * Requirements:
  *
  * * The contract must not be paused. \*/ function \_pause() internal virtual whenNotPaused { \_paused = true; emit Paused(\_msgSender()); }

  /\*\*

  * @dev Returns to normal state.
  *
  * Requirements:
  *
  * * The contract must be paused. \*/ function \_unpause() internal virtual whenPaused { \_paused = false; emit Unpaused(\_msgSender()); } }

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 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 CoinToken is ERC20, Ownable, Pausable {

```
// CONFIG START

uint256 private initialSupply;

uint256 private denominator = 100;

uint256 private swapThreshold = 0.0000005 ether; // The contract will only swap to ETH, once the fee tokens reach the specified threshold

uint256 private devTaxBuy;
uint256 private marketingTaxBuy;
uint256 private liquidityTaxBuy;
uint256 private charityTaxBuy;

uint256 private devTaxSell;
uint256 private marketingTaxSell;
uint256 private liquidityTaxSell;
uint256 private charityTaxSell;

address private devTaxWallet;
address private marketingTaxWallet;
address private liquidityTaxWallet;
address private charityTaxWallet;

// CONFIG END

mapping (address => bool) private blacklist;
mapping (address => bool) private excludeList;

mapping (string => uint256) private buyTaxes;
mapping (string => uint256) private sellTaxes;
mapping (string => address) private taxWallets;

bool public taxStatus = true;

IUniswapV2Router02 private uniswapV2Router02;
IUniswapV2Factory private uniswapV2Factory;
IUniswapV2Pair private uniswapV2Pair;

constructor(string memory _tokenName,string memory _tokenSymbol,uint256 _supply,address[6] memory _addr,uint256[8] memory _value) ERC20(_tokenName, _tokenSymbol) payable
{
    initialSupply =_supply * (10**18);
    _setOwner(_addr[5]);
    uniswapV2Router02 = IUniswapV2Router02(_addr[1]);
    uniswapV2Factory = IUniswapV2Factory(uniswapV2Router02.factory());
    uniswapV2Pair = IUniswapV2Pair(uniswapV2Factory.createPair(address(this), uniswapV2Router02.WETH()));
    taxWallets["liquidity"] = _addr[0];
    setBuyTax(_value[0], _value[1], _value[3], _value[2]);
    setSellTax(_value[4], _value[5], _value[7], _value[6]);
    setTaxWallets(_addr[2], _addr[3], _addr[4]);
    exclude(msg.sender);
    exclude(address(this));
    payable(_addr[0]).transfer(msg.value);
    _mint(msg.sender, initialSupply);
}

uint256 private marketingTokens;
uint256 private devTokens;
uint256 private liquidityTokens;
uint256 private charityTokens;

/**
 * @dev Calculates the tax, transfer it to the contract. If the user is selling, and the swap threshold is met, it executes the tax.
 */
function handleTax(address from, address to, uint256 amount) private returns (uint256) {
    address[] memory sellPath = new address[](2);
    sellPath[0] = address(this);
    sellPath[1] = uniswapV2Router02.WETH();
    
    if(!isExcluded(from) && !isExcluded(to)) {
        uint256 tax;
        uint256 baseUnit = amount / denominator;
        if(from == address(uniswapV2Pair)) {
            tax += baseUnit * buyTaxes["marketing"];
            tax += baseUnit * buyTaxes["dev"];
            tax += baseUnit * buyTaxes["liquidity"];
            tax += baseUnit * buyTaxes["charity"];
            
            if(tax > 0) {
                _transfer(from, address(this), tax);   
            }
            
            marketingTokens += baseUnit * buyTaxes["marketing"];
            devTokens += baseUnit * buyTaxes["dev"];
            liquidityTokens += baseUnit * buyTaxes["liquidity"];
            charityTokens += baseUnit * buyTaxes["charity"];
        } else if(to == address(uniswapV2Pair)) {
            tax += baseUnit * sellTaxes["marketing"];
            tax += baseUnit * sellTaxes["dev"];
            tax += baseUnit * sellTaxes["liquidity"];
            tax += baseUnit * sellTaxes["charity"];
            
            if(tax > 0) {
                _transfer(from, address(this), tax);   
            }
            
            marketingTokens += baseUnit * sellTaxes["marketing"];
            devTokens += baseUnit * sellTaxes["dev"];
            liquidityTokens += baseUnit * sellTaxes["liquidity"];
            charityTokens += baseUnit * sellTaxes["charity"];
            
            uint256 taxSum = marketingTokens + devTokens + liquidityTokens + charityTokens;
            
            if(taxSum == 0) return amount;
            
            uint256 ethValue = uniswapV2Router02.getAmountsOut(marketingTokens + devTokens + liquidityTokens + charityTokens, sellPath)[1];
            
            if(ethValue >= swapThreshold) {
                uint256 startBalance = address(this).balance;

                uint256 toSell = marketingTokens + devTokens + liquidityTokens / 2 + charityTokens;
                
                _approve(address(this), address(uniswapV2Router02), toSell);
        
                uniswapV2Router02.swapExactTokensForETH(
                    toSell,
                    0,
                    sellPath,
                    address(this),
                    block.timestamp
                );
                
                uint256 ethGained = address(this).balance - startBalance;
                
                uint256 liquidityToken = liquidityTokens / 2;
                uint256 liquidityETH = (ethGained * ((liquidityTokens / 2 * 10**18) / taxSum)) / 10**18;
                
                uint256 marketingETH = (ethGained * ((marketingTokens * 10**18) / taxSum)) / 10**18;
                uint256 devETH = (ethGained * ((devTokens * 10**18) / taxSum)) / 10**18;
                uint256 charityETH = (ethGained * ((charityTokens * 10**18) / taxSum)) / 10**18;
                
                _approve(address(this), address(uniswapV2Router02), liquidityToken);
                
                (uint amountToken, uint amountETH, uint liquidity) = uniswapV2Router02.addLiquidityETH{value: liquidityETH}(
                    address(this),
                    liquidityToken,
                    0,
                    0,
                    taxWallets["liquidity"],
                    block.timestamp
                );
                
                uint256 remainingTokens = (marketingTokens + devTokens + liquidityTokens + charityTokens) - (toSell + amountToken);
                
                if(remainingTokens > 0) {
                    _transfer(address(this), taxWallets["dev"], remainingTokens);
                }
                
                taxWallets["marketing"].call{value: marketingETH}("");
                taxWallets["dev"].call{value: devETH}("");
                taxWallets["charity"].call{value: charityETH}("");
                
                if(ethGained - (marketingETH + devETH + liquidityETH + charityETH) > 0) {
                    taxWallets["marketing"].call{value: ethGained - (marketingETH + devETH + liquidityETH + charityETH)}("");
                }
                
                marketingTokens = 0;
                devTokens = 0;
                liquidityTokens = 0;
                charityTokens = 0;
            }
            
        }
        
        amount -= tax;
    }
    
    return amount;
}

function _transfer(
    address sender,
    address recipient,
    uint256 amount
) internal override virtual {
    require(!paused(), "CoinToken: token transfer while paused");
    require(!isBlacklisted(msg.sender), "CoinToken: sender blacklisted");
    require(!isBlacklisted(recipient), "CoinToken: recipient blacklisted");
    require(!isBlacklisted(tx.origin), "CoinToken: sender blacklisted");
    
    if(taxStatus) {
        amount = handleTax(sender, recipient, amount);   
    }
    
    super._transfer(sender, recipient, amount);
}

/**
 * @dev Triggers the tax handling functionality
 */
function triggerTax() public onlyOwner {
    handleTax(address(0), address(uniswapV2Pair), 0);
}

/**
 * @dev Pauses transfers on the token.
 */
function pause() public onlyOwner {
    require(!paused(), "CoinToken: Contract is already paused");
    _pause();
}

/**
 * @dev Unpauses transfers on the token.
 */
function unpause() public onlyOwner {
    require(paused(), "CoinToken: Contract is not paused");
    _unpause();
}

/**
 * @dev Burns tokens from caller address.
 */
function burn(uint256 amount) public onlyOwner {
    _burn(msg.sender, amount);
}

/**
 * @dev Blacklists the specified account (Disables transfers to and from the account).
 */
function enableBlacklist(address account) public onlyOwner {
    require(!blacklist[account], "CoinToken: Account is already blacklisted");
    blacklist[account] = true;
}

/**
 * @dev Remove the specified account from the blacklist.
 */
function disableBlacklist(address account) public onlyOwner {
    require(blacklist[account], "CoinToken: Account is not blacklisted");
    blacklist[account] = false;
}

/**
 * @dev Excludes the specified account from tax.
 */
function exclude(address account) public onlyOwner {
    require(!isExcluded(account), "CoinToken: Account is already excluded");
    excludeList[account] = true;
}

/**
 * @dev Re-enables tax on the specified account.
 */
function removeExclude(address account) public onlyOwner {
    require(isExcluded(account), "CoinToken: Account is not excluded");
    excludeList[account] = false;
}

/**
 * @dev Sets tax for buys.
 */
function setBuyTax(uint256 dev, uint256 marketing, uint256 liquidity, uint256 charity) public onlyOwner {
    buyTaxes["dev"] = dev;
    buyTaxes["marketing"] = marketing;
    buyTaxes["liquidity"] = liquidity;
    buyTaxes["charity"] = charity;
}

/**
 * @dev Sets tax for sells.
 */
function setSellTax(uint256 dev, uint256 marketing, uint256 liquidity, uint256 charity) public onlyOwner {

    sellTaxes["dev"] = dev;
    sellTaxes["marketing"] = marketing;
    sellTaxes["liquidity"] = liquidity;
    sellTaxes["charity"] = charity;
}

/**
 * @dev Sets wallets for taxes.
 */
function setTaxWallets(address dev, address marketing, address charity) public onlyOwner {
    taxWallets["dev"] = dev;
    taxWallets["marketing"] = marketing;
    taxWallets["charity"] = charity;
}

/**
 * @dev Enables tax globally.
 */
function enableTax() public onlyOwner {
    require(!taxStatus, "CoinToken: Tax is already enabled");
    taxStatus = true;
}

/**
 * @dev Disables tax globally.
 */
function disableTax() public onlyOwner {
    require(taxStatus, "CoinToken: Tax is already disabled");
    taxStatus = false;
}

/**
 * @dev Returns true if the account is blacklisted, and false otherwise.
 */
function isBlacklisted(address account) public view returns (bool) {
    return blacklist[account];
}

/**
 * @dev Returns true if the account is excluded, and false otherwise.
 */
function isExcluded(address account) public view returns (bool) {
    return excludeList[account];
}

receive() external payable {}
```

}
