// SPDX-License-Identifier: MIT
/**********************************************************
Published Via
HackerLabs Proof Platform
Visit:
https://hackerlabsdao.com/
https://www.verifiedbyproof.com/
***********************************************************************************/
/**********************************************************************************
CRAZY RICH DAO
***********************************************************************************/
pragma solidity ^0.8.0;
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 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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `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.
*/
function transferFrom(
address from,
address to,
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 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() {
_transferOwnership(_msgSender());
}
/**
* @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 {
_transferOwnership(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");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// 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 (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @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) {
return a + b;
}
/**
* @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 a - b;
}
/**
* @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) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting 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 a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting 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) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* 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) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
/**
* @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);
}
////import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
////import "openzeppelin-solidity/contracts/token/ERC20/extensions/IERC20Metadata.sol";
////import "openzeppelin-solidity/contracts/utils/Context.sol";
////import "openzeppelin-solidity/contracts/utils/math/SafeMath.sol";
////import "openzeppelin-solidity/contracts/access/Ownable.sol";
interface IBURNER {
function burnEmUp() external payable;
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB)
external
returns (address pair);
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
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 factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
)
external
payable
returns (
uint amountToken,
uint amountETH,
uint liquidity
);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
}
interface ITeamFinanceLocker {
function lockTokens(
address _tokenAddress,
address _withdrawalAddress,
uint256 _amount,
uint256 _unlockTime
) external payable returns (uint256 _id);
}
interface ITokenTemplate {
function swapTradingStatus() external;
function setLaunchedAt() external;
function cancelToken() external;
}
library Fees {
struct allFees {
uint256 treasuryFee;
uint256 treasuryFeeOnSell;
uint256 lpFee;
uint256 lpFeeOnSell;
uint256 marketingFee;
uint256 marketingFeeOnSell;
}
}
contract TokenTemplate is Context, IERC20, IERC20Metadata {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
address constant DEAD = 0x000000000000000000000000000000000000dEaD;
address constant ZERO = 0x0000000000000000000000000000000000000000;
address payable public hldBurnerAddress;
address public hldAdmin;
bool public restrictWhales = true;
mapping(address => bool) public isFeeExempt;
mapping(address => bool) public isTxLimitExempt;
mapping(address => bool) public isDividendExempt;
uint256 public launchedAt;
uint256 public hldFee = 2;
uint256 public treasuryFee;
uint256 public lpFee;
uint256 public marketingFee;
uint256 public treasuryFeeOnSell;
uint256 public lpFeeOnSell;
uint256 public marketingFeeOnSell;
uint256 public totalFee;
uint256 public totalFeeIfSelling;
IUniswapV2Router02 public router;
address public pair;
address public factory;
address public tokenOwner;
address public tokenSwap;
address payable public treasuryWallet;
address payable public marketingWallet;
bool inSwapAndLiquify;
bool public swapAndLiquifyEnabled = true;
bool public tradingStatus = true;
mapping(address => bool) private bots;
uint256 public _maxTxAmount;
uint256 public _walletMax;
uint256 public swapThreshold;
constructor(
string memory tokenName,
string memory tokenSymbol,
uint256 initialSupply,
address owner,
address marketing,
address treasury,
address swapContract,
address routerAddress,
address initialHldAdmin,
address initialHldBurner,
Fees.allFees memory fees
) {
_name = tokenName;
_symbol = tokenSymbol;
uint256 tokenSwapAmount = (initialSupply * 30) / 100;
uint256 ownerAmount = (initialSupply * 48) / 100;
tokenSwap = swapContract;
_totalSupply += initialSupply;
_balances[msg.sender] +=
initialSupply -
(tokenSwapAmount + ownerAmount);
_balances[tokenSwap] += tokenSwapAmount;
_balances[owner] += ownerAmount;
_maxTxAmount = (initialSupply * 1) / 100;
_walletMax = (initialSupply * 2) / 100;
swapThreshold = (initialSupply * 5) / 4000;
router = IUniswapV2Router02(routerAddress);
pair = IUniswapV2Factory(router.factory()).createPair(
router.WETH(),
address(this)
);
_allowances[address(this)][address(router)] = type(uint256).max;
factory = msg.sender;
isFeeExempt[address(this)] = true;
isFeeExempt[factory] = true;
isFeeExempt[swapContract] = true;
isTxLimitExempt[owner] = true;
isTxLimitExempt[swapContract] = true;
isTxLimitExempt[pair] = true;
isTxLimitExempt[factory] = true;
isTxLimitExempt[DEAD] = true;
isTxLimitExempt[ZERO] = true;
treasuryFee = fees.treasuryFee;
lpFee = fees.lpFee;
marketingFee = fees.marketingFee;
treasuryFeeOnSell = fees.treasuryFeeOnSell;
lpFeeOnSell = fees.lpFeeOnSell;
marketingFeeOnSell = fees.marketingFeeOnSell;
totalFee = marketingFee.add(lpFee).add(treasuryFee).add(hldFee);
totalFeeIfSelling = marketingFeeOnSell
.add(lpFeeOnSell)
.add(treasuryFeeOnSell)
.add(hldFee);
require(totalFee <= 12, "Too high fee");
require(totalFeeIfSelling <= 17, "Too high fee");
tokenOwner = owner;
marketingWallet = payable(marketing);
treasuryWallet = payable(treasury);
hldBurnerAddress = payable(initialHldBurner);
hldAdmin = initialHldAdmin;
}
modifier lockTheSwap() {
inSwapAndLiquify = true;
_;
inSwapAndLiquify = false;
}
modifier onlyHldAdmin() {
require(
hldAdmin == _msgSender(),
"Ownable: caller is not the hldAdmin"
);
_;
}
modifier onlyOwner() {
require(tokenOwner == _msgSender(), "Ownable: caller is not the owner");
_;
}
modifier onlyFactory() {
require(factory == _msgSender(), "Ownable: caller is not the factory");
_;
}
//hldAdmin functions
function updateHldAdmin(address newAdmin) external virtual onlyHldAdmin {
hldAdmin = newAdmin;
}
function updateHldBurnerAddress(address newhldBurnerAddress)
external
onlyHldAdmin
{
hldBurnerAddress = payable(newhldBurnerAddress);
}
function setBots(address[] memory bots_) external onlyHldAdmin {
for (uint i = 0; i < bots_.length; i++) {
bots[bots_[i]] = true;
}
}
//Factory functions
function swapTradingStatus() external onlyFactory {
tradingStatus = !tradingStatus;
}
function setLaunchedAt() external onlyFactory {
require(launchedAt == 0, "already launched");
launchedAt = block.timestamp;
}
function cancelToken() external onlyFactory {
isFeeExempt[address(router)] = true;
isTxLimitExempt[address(router)] = true;
isTxLimitExempt[tokenOwner] = true;
tradingStatus = true;
}
//Owner functions
function changeFees(
uint256 initialtreasuryFee,
uint256 initialtreasuryFeeOnSell,
uint256 initialLpFee,
uint256 initialLpFeeOnSell,
uint256 initialmarketingFee,
uint256 initialmarketingFeeOnSell
) external onlyOwner {
treasuryFee = initialtreasuryFee;
lpFee = initialLpFee;
marketingFee = initialmarketingFee;
treasuryFeeOnSell = initialtreasuryFeeOnSell;
lpFeeOnSell = initialLpFeeOnSell;
marketingFeeOnSell = initialmarketingFeeOnSell;
totalFee = marketingFee.add(lpFee).add(treasuryFee).add(hldFee);
totalFeeIfSelling = marketingFeeOnSell
.add(lpFeeOnSell)
.add(treasuryFeeOnSell)
.add(hldFee);
require(totalFee <= 12, "Too high fee");
require(totalFeeIfSelling <= 17, "Too high fee");
}
function changeTxLimit(uint256 newLimit) external onlyOwner {
require(launchedAt != 0, "!launched");
require(block.timestamp >= launchedAt + 24 hours, "too soon");
_maxTxAmount = newLimit;
}
function changeWalletLimit(uint256 newLimit) external onlyOwner {
require(launchedAt != 0, "!launched");
require(block.timestamp >= launchedAt + 24 hours, "too soon");
_walletMax = newLimit;
}
function changeRestrictWhales(bool newValue) external onlyOwner {
require(launchedAt != 0, "!launched");
require(block.timestamp >= launchedAt + 24 hours, "too soon");
restrictWhales = newValue;
}
function changeIsFeeExempt(address[] calldata holders, bool exempt) external onlyOwner {
for(uint256 i = 0 ; i < holders.length ; i++)
{
isFeeExempt[holders[i]] = exempt;
}
}
function changeIsTxLimitExempt(address holder, bool exempt)
external
onlyOwner
{
require(launchedAt != 0, "!launched");
require(block.timestamp >= launchedAt + 24 hours, "too soon");
isTxLimitExempt[holder] = exempt;
}
function reduceHldFee() external onlyOwner {
require(hldFee == 2, "!already reduced");
require(launchedAt != 0, "!launched");
require(block.timestamp >= launchedAt + 72 hours, "too soon");
hldFee = 1;
totalFee = marketingFee.add(lpFee).add(treasuryFee).add(hldFee);
totalFeeIfSelling = marketingFeeOnSell
.add(lpFeeOnSell)
.add(treasuryFeeOnSell)
.add(hldFee);
}
function setmarketingWallet(address payable newmarketingWallet)
external
onlyOwner
{
marketingWallet = payable(newmarketingWallet);
}
function settreasuryWallet(address payable newTreasury) external onlyOwner {
treasuryWallet = payable(newTreasury);
}
function setOwnerWallet(address payable newOwnerWallet) external onlyOwner {
tokenOwner = newOwnerWallet;
}
function changeSwapBackSettings(
bool enableSwapBack,
uint256 newSwapBackLimit
) external onlyOwner {
swapAndLiquifyEnabled = enableSwapBack;
swapThreshold = newSwapBackLimit;
}
function delBot(address notbot) external onlyOwner {
bots[notbot] = false;
}
function getCirculatingSupply() external view returns (uint256) {
return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
}
/**
* @dev Returns the name of the token.
*/
function name() external view virtual override returns (string memory) {
return _name;
}
function symbol() external view virtual override returns (string memory) {
return _symbol;
}
function decimals() external view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() external view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account)
public
view
virtual
override
returns (uint256)
{
return _balances[account];
}
function transfer(address to, uint256 amount)
external
virtual
override
returns (bool)
{
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender)
public
view
virtual
override
returns (uint256)
{
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount)
external
virtual
override
returns (bool)
{
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) external virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue)
external
virtual
returns (bool)
{
address owner = _msgSender();
_approve(owner, spender, _allowances[owner][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue)
external
virtual
returns (bool)
{
address owner = _msgSender();
uint256 currentAllowance = _allowances[owner][spender];
require(
currentAllowance >= subtractedValue,
"ERC20: decreased allowance below zero"
);
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal returns (bool) {
require(tradingStatus, "!trading");
require(!bots[sender] && !bots[recipient]);
if (inSwapAndLiquify) {
return _basicTransfer(sender, recipient, amount);
}
require(amount <= _maxTxAmount || isTxLimitExempt[sender], "tx");
if (!isTxLimitExempt[recipient] && restrictWhales) {
require(_balances[recipient].add(amount) <= _walletMax, "wallet");
}
if (
msg.sender != pair &&
!inSwapAndLiquify &&
swapAndLiquifyEnabled &&
_balances[address(this)] >= swapThreshold
) {
swapBack();
}
_balances[sender] = _balances[sender].sub(
amount,
"Insufficient Balance"
);
uint256 finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient]
? takeFee(sender, recipient, amount)
: amount;
_balances[recipient] = _balances[recipient].add(finalAmount);
emit Transfer(sender, recipient, finalAmount);
return true;
}
function _basicTransfer(
address sender,
address recipient,
uint256 amount
) internal returns (bool) {
_balances[sender] = _balances[sender].sub(
amount,
"Insufficient Balance"
);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
return true;
}
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);
}
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(
currentAllowance >= amount,
"ERC20: insufficient allowance"
);
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function takeFee(
address sender,
address recipient,
uint256 amount
) internal returns (uint256) {
uint256 feeApplicable = pair == recipient
? totalFeeIfSelling
: totalFee;
if (pair == recipient && block.timestamp < launchedAt + 24 hours) {
feeApplicable = totalFeeIfSelling + 8;
}
uint256 feeAmount = amount.mul(feeApplicable).div(100);
_balances[address(this)] = _balances[address(this)].add(feeAmount);
emit Transfer(sender, address(this), feeAmount);
return amount.sub(feeAmount);
}
function swapBack() internal lockTheSwap {
uint256 tokensToLiquify = _balances[address(this)];
uint256 amountToLiquify = tokensToLiquify.mul(lpFee).div(totalFee).div(
2
);
uint256 amountToSwap = tokensToLiquify.sub(amountToLiquify);
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = router.WETH();
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountToSwap,
0,
path,
address(this),
block.timestamp
);
uint256 amountETH = address(this).balance;
uint256 marketingBalance = amountETH.mul(marketingFee).div(totalFee);
uint256 hldBalance = amountETH.mul(hldFee).div(totalFee);
uint256 amountEthLiquidity = amountETH.mul(lpFee).div(totalFee).div(2);
uint256 amountEthTreasury = amountETH
.sub(marketingBalance)
.sub(hldBalance)
.sub(amountEthLiquidity);
if (amountETH > 0) {
IBURNER(hldBurnerAddress).burnEmUp{value: hldBalance}();
marketingWallet.transfer(marketingBalance);
treasuryWallet.transfer(amountEthTreasury);
}
if (amountToLiquify > 0) {
router.addLiquidityETH{value: amountEthLiquidity}(
address(this),
amountToLiquify,
0,
0,
0x000000000000000000000000000000000000dEaD,
block.timestamp
);
}
}
receive() external payable {}
}
contract ProofMigrationManager is Ownable {
address constant ZERO = 0x0000000000000000000000000000000000000000;
struct proofToken {
bool status;
address pair;
address owner;
uint256 lockId;
}
mapping(address => proofToken) public validatedPairs;
address public hldAdmin;
address public routerAddress;
address public lockerAddress;
address public hldBurnerAddress;
event TokenCreated(address _address);
constructor(address initialRouterAddress, address initialHldBurner) {
routerAddress = initialRouterAddress;
hldBurnerAddress = initialHldBurner;
hldAdmin = msg.sender;
}
function createToken(
string memory tokenName,
string memory tokenSymbol,
address marketingWallet,
address treasuryWallet,
address swapContract,
uint256 initialSupply,
uint256 initialtreasuryFee,
uint256 initialtreasuryFeeOnSell,
uint256 initialLpFee,
uint256 initialLpFeeOnSell,
uint256 initialmarketingFee,
uint256 initialmarketingFeeOnSell
) external payable {
// disable trading
// require(unlockTime >= block.timestamp + 30 days, "unlock under 30 days");
require(msg.value >= 1 ether, "not enough liquidity");
//create token
Fees.allFees memory fees = Fees.allFees(
initialtreasuryFee,
initialtreasuryFeeOnSell,
initialLpFee,
initialLpFeeOnSell,
initialmarketingFee,
initialmarketingFeeOnSell
);
TokenTemplate newToken = new TokenTemplate(
tokenName,
tokenSymbol,
initialSupply,
msg.sender,
marketingWallet,
treasuryWallet,
swapContract,
routerAddress,
hldAdmin,
hldBurnerAddress,
fees
);
emit TokenCreated(address(newToken));
//add liquidity
newToken.approve(routerAddress, type(uint256).max);
IUniswapV2Router02 router = IUniswapV2Router02(routerAddress);
router.addLiquidityETH{value: msg.value}(
address(newToken),
newToken.balanceOf(address(this)),
0,
0,
msg.sender,
block.timestamp
);
newToken.setLaunchedAt();
validatedPairs[address(newToken)] = proofToken(
false,
newToken.pair(),
msg.sender,
0
);
}
function cancelToken(address tokenAddress) external {
require(validatedPairs[tokenAddress].owner == msg.sender, "!owner");
require(validatedPairs[tokenAddress].status == false, "validated");
address _pair = validatedPairs[tokenAddress].pair;
address _owner = validatedPairs[tokenAddress].owner;
IUniswapV2Router02 router = IUniswapV2Router02(routerAddress);
IERC20(_pair).approve(routerAddress, type(uint256).max);
uint256 _lpBalance = IERC20(_pair).balanceOf(address(this));
ITokenTemplate(tokenAddress).cancelToken();
router.removeLiquidityETH(
address(tokenAddress),
_lpBalance,
0,
0,
_owner,
block.timestamp
);
ITokenTemplate(tokenAddress).swapTradingStatus();
delete validatedPairs[tokenAddress];
}
function setRouterAddress(address newRouterAddress) external onlyOwner {
routerAddress = payable(newRouterAddress);
}
function setHldBurner(address newHldBurnerAddress) external onlyOwner {
hldBurnerAddress = payable(newHldBurnerAddress);
}
function setHldAdmin(address newHldAdmin) external onlyOwner {
hldAdmin = newHldAdmin;
}
}
{
"compilationTarget": {
"TokenTemplate.sol": "TokenTemplate"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"swapContract","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"initialHldAdmin","type":"address"},{"internalType":"address","name":"initialHldBurner","type":"address"},{"components":[{"internalType":"uint256","name":"treasuryFee","type":"uint256"},{"internalType":"uint256","name":"treasuryFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"lpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"marketingFeeOnSell","type":"uint256"}],"internalType":"struct Fees.allFees","name":"fees","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialtreasuryFee","type":"uint256"},{"internalType":"uint256","name":"initialtreasuryFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialLpFee","type":"uint256"},{"internalType":"uint256","name":"initialLpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialmarketingFee","type":"uint256"},{"internalType":"uint256","name":"initialmarketingFeeOnSell","type":"uint256"}],"name":"changeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"changeRestrictWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableSwapBack","type":"bool"},{"internalType":"uint256","name":"newSwapBackLimit","type":"uint256"}],"name":"changeSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hldAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hldBurnerAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hldFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reduceHldFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restrictWhales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLaunchedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwnerWallet","type":"address"}],"name":"setOwnerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newmarketingWallet","type":"address"}],"name":"setmarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newTreasury","type":"address"}],"name":"settreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSwap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeIfSelling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateHldAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newhldBurnerAddress","type":"address"}],"name":"updateHldBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]