// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragmasolidity ^0.8.0;/**
* @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.
*/abstractcontractContext{
function_msgSender() internalviewvirtualreturns (address) {
returnmsg.sender;
}
function_msgData() internalviewvirtualreturns (bytescalldata) {
returnmsg.data;
}
}
Contract Source Code
File 2 of 7: IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)pragmasolidity ^0.8.0;/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/interfaceIERC20{
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/eventTransfer(addressindexedfrom, addressindexed 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.
*/eventApproval(addressindexed owner, addressindexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/functiontotalSupply() externalviewreturns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/functionbalanceOf(address account) externalviewreturns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransfer(address to, uint256 amount) externalreturns (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.
*/functionallowance(address owner, address spender) externalviewreturns (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.
*/functionapprove(address spender, uint256 amount) externalreturns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` 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.
*/functiontransferFrom(addressfrom,
address to,
uint256 amount
) externalreturns (bool);
}
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)pragmasolidity ^0.8.0;import"../utils/Context.sol";
/**
* @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.
*/abstractcontractOwnableisContext{
addressprivate _owner;
eventOwnershipTransferred(addressindexed previousOwner, addressindexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/modifieronlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/functionowner() publicviewvirtualreturns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/function_checkOwner() internalviewvirtual{
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.
*/functionrenounceOwnership() publicvirtualonlyOwner{
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/functiontransferOwnership(address newOwner) publicvirtualonlyOwner{
require(newOwner !=address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/function_transferOwnership(address newOwner) internalvirtual{
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
Contract Source Code
File 7 of 7: WDUM.sol
// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;import"@openzeppelin/contracts/access/Ownable.sol";
import"@openzeppelin/contracts/token/ERC20/IERC20.sol";
import"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import"@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
contractWDUMTisOwnable, IERC20{
// Token namestringprivate _name;
// Token symbolstringprivate _symbol;
// Token decimalsuint256private _decimals;
// Token Total Supplyuint256private _totalSupply;
// Mapping from address to amount of Tokenmapping(address=>uint256) private _balances;
// Mapping from owner to operator's allowancesmapping(address=>mapping(address=>uint256)) private _allowances;
// Flag to check if in swapbool inSwap;
// Uniswap V2 Router
IUniswapV2Router02 public dexRouter;
// Buy Tax and Sell Tax when trading.uint256public buyTax =100;
uint256public sellTax =200;
// Tax Divisoruint256public taxDivisor =10000;
// Max wallet sizeuint256private _maxWalletSize;
// Thresold to add liquidityuint256public swapThreshold =100*10**18;
uint256public swapETHThreshold =0.05ether;
// Pair address with ETH on Uniswap V2addresspublic pairETH;
// Mapping from address to flag to verify if it's pairmapping(address=>bool) private _isPair;
// Mapping from address to flag to verify if it's fee exemptmapping(address=>bool) private _isFeeExempt;
// Mapping from address to flag to verify if it's fee exemptmapping(address=>bool) private _isLimitExempt;
// Null addressesaddressconstantprivate ZERO =0x0000000000000000000000000000000000000000;
addressconstantprivate DEAD =0x000000000000000000000000000000000000dEaD;
// Address list of team walletsaddressconstantpublic teamWallet1 =0xC6B0486F0F298573105f311ccBA9158d1D184BFF;
addressconstantpublic teamWallet2 =0x193Ef8019d0ECf92591437908E37e14874384951;
addressconstantpublic teamWallet3 =0x82701b74c79269F27391D7A0d0b9Fc7Affdc607E;
addressconstantpublic teamWallet4 =0x1f54ECaD6c0200d4227884745f9116c8e1EACa33;
// Marketing wallet addressaddressconstantpublic marketingWallet =0x256CB6490df9a4FbC1F8C176f967FFe1DD52a54A;
eventSwapAndLiquify(uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensAddedToLiquidity
);
/**
* @dev Sets the initialization values.
*/constructor() {
_name ="What Do You Meme";
_symbol ="$WDUMT";
_decimals =18;
_totalSupply =1000000000*10**18;
_maxWalletSize = _totalSupply *4/100;
_balances[owner()] = _totalSupply *92/100;
_balances[teamWallet1] = _totalSupply /50;
_balances[teamWallet2] = _totalSupply /50;
_balances[teamWallet3] = _totalSupply /50;
_balances[teamWallet4] = _totalSupply /50;
_isFeeExempt[owner()] =true;
_isFeeExempt[address(this)] =true;
_isFeeExempt[teamWallet1] =true;
_isFeeExempt[teamWallet2] =true;
_isFeeExempt[teamWallet3] =true;
_isFeeExempt[teamWallet4] =true;
address router =0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
dexRouter = IUniswapV2Router02(router);
pairETH = IUniswapV2Factory(dexRouter.factory()).createPair(dexRouter.WETH(), address(this));
_isPair[pairETH] =true;
_isLimitExempt[pairETH] =true;
_isLimitExempt[router] =true;
_isLimitExempt[ZERO] =true;
_isLimitExempt[DEAD] =true;
_approve(owner(), address(dexRouter), type(uint256).max);
_approve(address(this), address(dexRouter), type(uint256).max);
}
receive() externalpayable{}
modifierswapping() {
require(inSwap ==false, "ReentrancyGuard: reentrant call");
inSwap =true;
_;
inSwap =false;
}
/**
* @dev Returns the name of the token.
*/functionname() publicviewreturns(stringmemory) {
return _name;
}
/**
* @dev Returns the symbol of the token.
*/functionsymbol() publicviewreturns(stringmemory) {
return _symbol;
}
/**
* @dev Returns the decimals of the token.
*/functiondecimals() publicviewreturns(uint256) {
return _decimals;
}
/**
* @dev Returns the total supply of the token.
*/functiontotalSupply() publicviewoverridereturns(uint256) {
return _totalSupply;
}
/**
* @dev Returns the total supply of the token.
*/functioncirculatingSupply() publicviewreturns(uint256) {
return _totalSupply - balanceOf(ZERO) - balanceOf(DEAD);
}
/**
* @dev Returns the amount of tokens owned by `account`.
*/functionbalanceOf(address account) publicviewoverridereturns(uint256) {
return _balances[account];
}
/**
* @dev Returns the max amount to hold the token.
*/functionmaxWalletSize() externalviewreturns(uint256) {
return _maxWalletSize;
}
/**
* @dev Returns the allowances.
*/functionallowance(address owner, address spender) publicviewoverridereturns(uint256) {
return _allowances[owner][spender];
}
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*/functionapprove(address spender, uint256 amount) publicoverridereturns(bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
returntrue;
}
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*/functiontransfer(address to, uint256 amount) publicoverridereturns(bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
returntrue;
}
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*/functiontransferFrom(addressfrom,
address to,
uint256 amount
) externaloverridereturns(bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
returntrue;
}
/**
* @dev Burns the tokens from owner's account.
*/functionburn(uint256 amount) externalreturns(bool) {
address owner =msg.sender;
require(balanceOf(owner) >= amount *10** _decimals, "Invalid amount");
_balances[owner] -= amount;
_burn(owner, amount);
returntrue;
}
/*////////////////////////////////////////////////
INTERNAL FUNCTIONS
////////////////////////////////////////////////*/function_spendAllowance(address owner,
address spender,
uint256 amount
) private{
uint256 currentAllowance = _allowances[owner][spender];
if(currentAllowance !=type(uint256).max) {
require(currentAllowance >= amount, "Insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function_approve(address owner,
address spender,
uint256 amount
) private{
require(owner !=address(0), "Approval from the zero address");
require(spender !=address(0), "Approval to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function_transfer(addressfrom,
address to,
uint256 amount
) private{
require(from!=address(0), "Transfer from the zero address");
require(to !=address(0), "Transfer to the null address");
require(amount >0, "Transfer amount must be greater than zero");
require(balanceOf(from) >= amount, "Transfer amount exceeds balance");
require(_isLimitExempt[to] ||
(!_isLimitExempt[to] &&
balanceOf(to) + amount <= _maxWalletSize),
"Exceeds the max wallet size"
);
bool buy =false;
bool sell =false;
bool other =false;
bool takeFee =true;
if(_isPair[from]) {
buy =true;
} elseif(_isPair[to]) {
sell =true;
} else {
other =true;
uint256 ethAmount =address(this).balance;
if(ethAmount >= swapETHThreshold) {
_swapETHForTokens(ethAmount);
}
}
if(_isFeeExempt[from] || _isFeeExempt[to] || other) {
takeFee =false;
}
_balances[from] -= amount;
uint256 amountReceived = takeFee ? _takeTaxes(from, buy, sell, amount) : amount;
_balances[to] += amountReceived;
emit Transfer(from, to, amountReceived);
}
function_takeTaxes(addressfrom, bool buy, bool sell, uint256 amount) privatereturns(uint256) {
uint256 taxAmount;
if(buy) {
taxAmount = amount * buyTax / taxDivisor;
if(taxAmount >0) {
_balances[address(this)] += taxAmount;
emit Transfer(from, address(this), taxAmount);
}
}
elseif(sell) {
taxAmount = amount * sellTax / taxDivisor;
if(taxAmount >0 ) {
_burn(from, taxAmount);
}
if(shouldAddLiquidity()) {
_swapAndLiquify();
}
}
return amount - taxAmount;
}
functionshouldAddLiquidity() publicviewreturns(bool) {
return!inSwap &&
balanceOf(address(this)) >= swapThreshold;
}
function_swapAndLiquify() privateswapping{
uint256 tokensToSwap = balanceOf(address(this)) /2;
uint256 tokensAddToLiquidity = balanceOf(address(this)) - tokensToSwap;
// Contract's current ETH balance.uint256 initialBalance =address(this).balance;
// Swap half of the tokens to ETH.
_swapTokensForETH(tokensToSwap);
// Figure out the exact amount of tokens received from swapping.uint256 ethAddToLiquify =address(this).balance- initialBalance;
// Add to the LP of this token and WETH pair (half ETH and half this token).
addLiquidity(ethAddToLiquify, tokensAddToLiquidity);
emit SwapAndLiquify(tokensToSwap, ethAddToLiquify, tokensAddToLiquidity);
}
function_swapTokensForETH(uint256 amount) private{
address[] memory path =newaddress[](2);
path[0] =address(this);
path[1] = dexRouter.WETH();
// Swap tokens to ETH
dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
amount,
0,
path,
address(this), // this contract will receive the eth that were swapped from the tokenblock.timestamp+600
);
}
function_swapETHForTokens(uint256 amount) private{
address[] memory path =newaddress[](2);
path[0] = dexRouter.WETH();
path[1] =address(this);
// Swap tokens to ETH
dexRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
0,
path,
address(this), // this contract will receive the eth that were swapped from the tokenblock.timestamp+600
);
}
functionaddLiquidity(uint256 ethAmount, uint256 tokenAmount) private{
// Add the ETH and token to LP.
dexRouter.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // slippage is unavoidable0, // slippage is unavoidableaddress(0),
block.timestamp+600
);
}
function_burn(addressfrom, uint256 amount) private{
_totalSupply -= amount;
_maxWalletSize = _totalSupply *4/100;
emit Transfer(from, address(0), amount);
}
}