This contract's source code is verified! Compiler
0.8.19+commit.7dd6d404
File 1 of 7: Context.sol
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 ;
}
}
File 2 of 7: IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer (address indexed from , address indexed to, uint256 value ) ;
event Approval (address indexed owner, address indexed spender, uint256 value ) ;
function totalSupply ( ) external view returns (uint256 ) ;
function balanceOf (address account ) external view returns (uint256 ) ;
function transfer (address to, uint256 amount ) external returns (bool ) ;
function allowance (address owner, address spender ) external view returns (uint256 ) ;
function approve (address spender, uint256 amount ) external returns (bool ) ;
function transferFrom (address from , address to, uint256 amount ) external returns (bool ) ;
}
File 3 of 7: IUniswapV2Factory.sol
pragma solidity >=0.5.0;
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 ;
}
File 4 of 7: IUniswapV2Router01.sol
pragma solidity >=0.6.2;
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 ) ;
}
File 5 of 7: IUniswapV2Router02.sol
pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol' ;
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 ;
}
File 6 of 7: Lock.sol
pragma solidity ^0.8.19;
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" ;
contract Stakify is Ownable , IERC20 {
address constant DEAD = 0x000000000000000000000000000000000000dEaD ;
address constant ZERO = 0x0000000000000000000000000000000000000000 ;
string constant _name = "Stakify" ;
string constant _symbol = "SIFY" ;
uint8 constant _decimals = 18 ;
uint256 _totalSupply;
mapping (address = > uint256 ) _balances;
mapping (address = > mapping (address = > uint256 )) _allowances;
mapping (address = > bool ) public isFeeExempt;
mapping (address = > bool ) public isAuthorized;
mapping (address = > bool ) isMaxWalletExcluded;
mapping (address = > bool ) isMaxTxExcluded;
address public treasuryWallet;
uint256 public buyLiquidityFee;
uint256 public buyTreasuryFee;
uint256 public buyBurnFee;
uint256 public buyStakeFee;
uint256 public buyTotalFee;
uint256 public sellLiquidityFee;
uint256 public sellTreasuryFee;
uint256 public sellStakeFee;
uint256 public sellBurnFee;
uint256 public sellTotalFee;
bool public isRepellentEnabled;
uint256 public repellentSellAutoBurnFee;
uint256 public repellentSellLiquidityFee;
uint256 public repellentSellTreasuryFee;
uint256 public repellentSellStakeFee;
uint256 public repellentSellTotalFee;
uint256 public repellentBuyAutoBurnFee;
uint256 public repellentBuyLiquidityFee;
uint256 public repellentBuyTreasuryFee;
uint256 public repellentBuyStakeFee;
uint256 public repellentBuyTotalFee;
address public stakingWallet;
uint256 public launchtAt;
event RepellentFeeActivated (uint256 activatedAmount ) ;
event RepellentFeeDisabled (uint256 disabledAmount ) ;
address BUSD;
enum LPLevels {
Level1,
Level2,
Level3,
Level4,
Level5
}
LPLevels public currentLpLevel;
bool public isRepellentFee;
uint256 public lastLPCheckedAt;
uint256 public lastLPAmount;
uint256 public lpCheckFrequency;
struct LPRange {
uint256 minLimit;
uint256 maxLimit;
uint256 dropLimit;
uint256 recoverLimit;
}
mapping (LPLevels = > LPRange) public lpRanges;
uint256 public repellentFeeActivatedAt;
uint256 public repellentFeeActivatedAmount;
uint256 public repellentFeeRecoverAmount;
uint256 public lastRepellentFeeActivatedAt;
uint256 public lastRepellentFeeRecoveredAt;
IUniswapV2Router02 public router;
address public pair;
bool public getTransferFees;
uint256 public swapThreshold;
uint256 public maxTreansaction;
uint256 public maxWallet;
bool public contractSwapEnabled;
bool public isTradeEnabled;
bool inContractSwap;
modifier swapping ( ) {
inContractSwap = true ;
_ ;
inContractSwap = false ;
}
event SetIsFeeExempt (address holder, bool status ) ;
event AddAuthorizedWallet (address holder, bool status ) ;
event SetDoContractSwap (bool status ) ;
event DoContractSwap (uint256 amount, uint256 time ) ;
event AutoLiquify (uint256 amountBNB, uint256 amountBOG ) ;
constructor ( ) {
_totalSupply = 244 * 10 * * 6 * (10 * * _decimals);
buyLiquidityFee = 1 ;
buyTreasuryFee = 2 ;
buyBurnFee = 1 ;
buyStakeFee = 1 ;
buyTotalFee = 5 ;
sellLiquidityFee = 1 ;
sellTreasuryFee = 22 ;
sellBurnFee = 1 ;
sellStakeFee = 1 ;
sellTotalFee = 25 ;
repellentSellAutoBurnFee = 15 ;
repellentSellLiquidityFee = 5 ;
repellentSellTreasuryFee = 10 ;
repellentSellTotalFee = 30 ;
repellentBuyAutoBurnFee = 0 ;
repellentBuyLiquidityFee = 0 ;
repellentBuyTreasuryFee = 0 ;
repellentBuyTotalFee = 0 ;
router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D );
pair = IUniswapV2Factory(router.factory()).createPair(
router.WETH(),
address (this )
);
_allowances[address (this )][address (router)] = type (uint256 ).max ;
treasuryWallet = 0xdAb6280d5a87c10250F454EE3AD3b3b0C1A274C0 ;
BUSD = 0xdAC17F958D2ee523a2206206994597C13D831ec7 ;
lpCheckFrequency = 24 hours ;
getTransferFees = false ;
isRepellentEnabled = true ;
swapThreshold = (_totalSupply * 1 ) / 10000 ;
maxTreansaction = (_totalSupply * 2 ) / 100 ;
maxWallet = (_totalSupply * 2 ) / 100 ;
contractSwapEnabled = true ;
isTradeEnabled = false ;
address newOwner = 0x64Ab7F64187AF212007A3EE9fdF990101DE4Bc16 ;
isFeeExempt[newOwner] = true ;
isFeeExempt[address (this )] = true ;
isFeeExempt[treasuryWallet] = true ;
isAuthorized[newOwner] = true ;
isAuthorized[address (this )] = true ;
isAuthorized[ZERO] = true ;
isAuthorized[DEAD] = true ;
isAuthorized[treasuryWallet] = true ;
isMaxWalletExcluded[msg .sender ] = true ;
isMaxTxExcluded[msg .sender ] = true ;
isMaxWalletExcluded[ZERO] = true ;
isMaxTxExcluded[ZERO] = true ;
isMaxWalletExcluded[DEAD] = true ;
isMaxTxExcluded[DEAD] = true ;
lpRanges[LPLevels.Level1].minLimit = 0 ;
lpRanges[LPLevels.Level1].maxLimit = 100000 * 10 * * 6 ;
lpRanges[LPLevels.Level1].dropLimit = 1000 ;
lpRanges[LPLevels.Level1].recoverLimit = 2000 ;
lpRanges[LPLevels.Level2].minLimit = 100000 * 10 * * 6 ;
lpRanges[LPLevels.Level2].maxLimit = 200000 * 10 * * 6 ;
lpRanges[LPLevels.Level2].dropLimit = 750 ;
lpRanges[LPLevels.Level2].recoverLimit = 1500 ;
lpRanges[LPLevels.Level3].minLimit = 200000 * 10 * * 6 ;
lpRanges[LPLevels.Level3].maxLimit = 500000 * 10 * * 6 ;
lpRanges[LPLevels.Level3].dropLimit = 500 ;
lpRanges[LPLevels.Level3].recoverLimit = 1000 ;
lpRanges[LPLevels.Level4].minLimit = 500000 * 10 * * 6 ;
lpRanges[LPLevels.Level4].maxLimit = 1000000 * 10 * * 6 ;
lpRanges[LPLevels.Level4].dropLimit = 250 ;
lpRanges[LPLevels.Level4].recoverLimit = 500 ;
lpRanges[LPLevels.Level5].minLimit = 1000000 * 10 * * 6 ;
lpRanges[LPLevels.Level5].maxLimit = 600000 * 10 * * 6 ;
lpRanges[LPLevels.Level5].dropLimit = 100 ;
lpRanges[LPLevels.Level5].recoverLimit = 200 ;
_balances[newOwner] = _totalSupply;
emit Transfer(address (0 ), newOwner, _totalSupply);
transferOwnership(newOwner);
}
receive ( ) external payable {}
function totalSupply ( ) external view override returns (uint256 ) {
return _totalSupply;
}
function name ( ) public pure returns (string memory ) {
return _name;
}
function symbol ( ) public pure returns (string memory ) {
return _symbol;
}
function decimals ( ) public pure returns (uint8 ) {
return _decimals;
}
function balanceOf (address account ) public view override returns (uint256 ) {
return _balances[account];
}
function allowance (
address holder,
address spender
) external view override returns (uint256 ) {
return _allowances[holder][spender];
}
function approve (
address spender,
uint256 amount
) public override returns (bool ) {
_allowances[msg .sender ][spender] = amount;
emit Approval(msg .sender , spender, 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 approveMax (address spender ) external returns (bool ) {
return approve(spender, type (uint256 ).max );
}
function transfer (
address recipient,
uint256 amount
) external override returns (bool ) {
return _transferFrom(msg .sender , recipient, amount);
}
function transferFrom (
address sender,
address recipient,
uint256 amount
) external override returns (bool ) {
if (_allowances[sender][msg .sender ] ! = type (uint256 ).max ) {
require (
_allowances[sender][msg .sender ] > = amount,
"Insufficient Allowance"
);
_allowances[sender][msg .sender ] =
_allowances[sender][msg .sender ] -
amount;
}
return _transferFrom(sender, recipient, amount);
}
function _transferFrom (
address sender,
address recipient,
uint256 amount
) internal returns (bool ) {
if (! isTradeEnabled) require (isAuthorized[sender], "Trading disabled" );
if (inContractSwap) {
return _basicTransfer(sender, recipient, amount);
}
if (! isMaxTxExcluded[sender])
require (amount < = maxTreansaction, "Max transaction exceeded" );
if (! isMaxWalletExcluded[recipient] & & recipient ! = pair) {
require (
(_balances[recipient] + amount) < = maxWallet,
"Max wallet exceeded"
);
}
if (
(lastLPCheckedAt + lpCheckFrequency) < block .timestamp & &
! isRepellentFee & &
isTradeEnabled
) {
uint256 lpBnbBalance = IERC20(router.WETH()).balanceOf(
address (pair)
);
lastLPAmount = getBnbPrice(lpBnbBalance);
lastLPCheckedAt = block .timestamp ;
}
if (isTradeEnabled) calculateLPStatus();
if (shouldDoContractSwap()) {
doContractSwap();
}
require (_balances[sender] > = amount, "Insufficient Balance" );
_balances[sender] = _balances[sender] - amount;
uint256 amountReceived = shouldTakeFee(sender, recipient)
? takeFee(sender, recipient, amount)
: amount;
_balances[recipient] = _balances[recipient] + amountReceived;
emit Transfer(sender, recipient, amountReceived);
return true ;
}
function shouldDoContractSwap ( ) internal view returns (bool ) {
return (msg .sender ! = pair & &
! inContractSwap & &
contractSwapEnabled & &
sellTotalFee > 0 & &
_balances[address (this )] > = swapThreshold);
}
function takeFee (
address sender,
address recipient,
uint256 amount
) internal returns (uint256 ) {
uint256 feeToken;
uint256 burnTokens;
uint256 stakeTokens;
if (isRepellentFee & & isRepellentEnabled) {
if (recipient = = pair & & repellentSellTotalFee > 0 ) {
feeToken = (amount * repellentSellTotalFee) / 100 ;
if (repellentSellAutoBurnFee > 0 )
burnTokens =
(feeToken * repellentSellAutoBurnFee) /
repellentSellTotalFee;
if (repellentSellStakeFee > 0 )
stakeTokens =
(feeToken * repellentSellStakeFee) /
repellentSellTotalFee;
} else if (repellentBuyTotalFee > 0 ) {
feeToken = (amount * repellentBuyTotalFee) / 100 ;
if (repellentBuyAutoBurnFee > 0 )
burnTokens =
(feeToken * repellentBuyAutoBurnFee) /
repellentBuyTotalFee;
if (repellentBuyStakeFee > 0 )
stakeTokens =
(feeToken * repellentBuyStakeFee) /
repellentSellTotalFee;
}
} else {
if (recipient = = pair & & sellTotalFee > 0 ) {
feeToken = (amount * sellTotalFee) / 100 ;
if (sellBurnFee > 0 )
burnTokens = (feeToken * sellBurnFee) / sellTotalFee;
if (sellStakeFee > 0 )
stakeTokens = (feeToken * sellStakeFee) / sellTotalFee;
} else if (buyTotalFee > 0 ) {
feeToken = (amount * buyTotalFee) / 100 ;
if (buyBurnFee > 0 )
burnTokens = (feeToken * buyBurnFee) / buyTotalFee;
if (buyStakeFee > 0 )
stakeTokens = (feeToken * buyStakeFee) / buyTotalFee;
}
}
if (burnTokens > 0 ) {
_balances[DEAD] = _balances[DEAD] + burnTokens;
emit Transfer(sender, DEAD, burnTokens);
}
if (stakeTokens > 0 ) {
_balances[stakingWallet] = _balances[stakingWallet] + stakeTokens;
emit Transfer(sender, stakingWallet, stakeTokens);
}
_balances[address (this )] =
_balances[address (this )] +
(feeToken - (burnTokens + stakeTokens));
emit Transfer(
sender,
address (this ),
(feeToken - (burnTokens + stakeTokens))
);
return (amount - feeToken);
}
function _basicTransfer (
address sender,
address recipient,
uint256 amount
) internal returns (bool ) {
require (_balances[sender] > = amount, "Insufficient Balance" );
_balances[sender] = _balances[sender] - amount;
_balances[recipient] = _balances[recipient] + amount;
emit Transfer(sender, recipient, amount);
return true ;
}
function shouldTakeFee (
address sender,
address to
) internal view returns (bool ) {
if (! getTransferFees) {
if (sender ! = pair & & to ! = pair) return false ;
}
if (isFeeExempt[sender] | | isFeeExempt[to]) {
return false ;
} else {
return true ;
}
}
function isFeeExcluded (address _wallet ) public view returns (bool ) {
return isFeeExempt[_wallet];
}
function doContractSwap ( ) internal swapping {
uint256 contractTokenBalance = _balances[address (this )];
uint256 tokensToLp = (contractTokenBalance * sellLiquidityFee) /
sellTotalFee;
uint256 marketingFee = contractTokenBalance - tokensToLp;
if (marketingFee > 0 ) {
swapTokensForEth(marketingFee);
uint256 swappedTokens = address (this ).balance ;
if (swappedTokens > 0 )
payable (treasuryWallet).transfer (swappedTokens);
}
if (tokensToLp > 0 ) swapAndLiquify(tokensToLp);
}
function swapAndLiquify (uint256 tokens ) private {
uint256 half = tokens / 2 ;
uint256 otherHalf = tokens - half;
uint256 initialBalance = address (this ).balance ;
swapTokensForEth(half);
uint256 newBalance = address (this ).balance - initialBalance;
addLiquidity(otherHalf, newBalance);
emit AutoLiquify(newBalance, otherHalf);
}
function swapTokensForEth (uint256 tokenAmount ) private {
address [] memory path = new address [](2 );
path[0 ] = address (this );
path[1 ] = router.WETH();
_approve(address (this ), address (router), tokenAmount);
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0 ,
path,
address (this ),
block .timestamp
);
}
function addLiquidity (uint256 tokenAmount, uint256 bnbAmount ) private {
_approve(address (this ), address (router), tokenAmount);
router.addLiquidityETH{value : bnbAmount}(
address (this ),
tokenAmount,
0 ,
0 ,
DEAD,
block .timestamp
);
}
function setIsFeeExempt (address holder, bool exempt ) external onlyOwner {
isFeeExempt[holder] = exempt;
emit SetIsFeeExempt(holder, exempt);
}
function setDoContractSwap (bool _enabled ) external onlyOwner {
contractSwapEnabled = _enabled;
emit SetDoContractSwap(_enabled);
}
function changeTreasuryWallet (address _wallet ) external onlyOwner {
treasuryWallet = _wallet;
}
function changeBuyFees (
uint256 _liquidityFee,
uint256 _treasuryFee,
uint256 _burnFee,
uint256 _stakeFee
) external onlyOwner {
buyLiquidityFee = _liquidityFee;
buyTreasuryFee = _treasuryFee;
buyBurnFee = _burnFee;
buyStakeFee = _stakeFee;
buyTotalFee = _liquidityFee + _treasuryFee + _burnFee + _stakeFee;
require (buyTotalFee < = 10 , "Total fees can not greater than 10%" );
}
function changeSellFees (
uint256 _liquidityFee,
uint256 _treasuryFee,
uint256 _burnFee,
uint256 _stakeFee
) external onlyOwner {
sellLiquidityFee = _liquidityFee;
sellTreasuryFee = _treasuryFee;
sellBurnFee = _burnFee;
sellStakeFee = _stakeFee;
sellTotalFee = _liquidityFee + _treasuryFee + _burnFee + _stakeFee;
if (isTradeEnabled & & (launchtAt + 24 hours ) < block .timestamp )
require (sellTotalFee < = 10 , "Total fees can not greater than 10%" );
}
function enableTrading ( ) external onlyOwner {
isTradeEnabled = true ;
launchtAt = block .timestamp ;
}
function setAuthorizedWallets (
address _wallet,
bool _status
) external onlyOwner {
isAuthorized[_wallet] = _status;
}
function rescueEth ( ) external onlyOwner {
uint256 balance = address (this ).balance ;
require (balance > 0 , "No enough ETH to transfer" );
payable (msg .sender ).transfer (balance);
}
function changeGetFeesOnTransfer (bool _status ) external onlyOwner {
getTransferFees = _status;
}
function changeLpCheckFrequency (uint256 _hours ) external onlyOwner {
lpCheckFrequency = _hours;
}
function changeRepellentSellFees (
uint256 _autoBurnFee,
uint256 _liquidityFee,
uint256 _treasuryFee,
uint256 _stakeFee
) external onlyOwner {
repellentSellAutoBurnFee = _autoBurnFee;
repellentSellLiquidityFee = _liquidityFee;
repellentSellTreasuryFee = _treasuryFee;
repellentSellStakeFee = _stakeFee;
repellentSellTotalFee =
_autoBurnFee +
_liquidityFee +
_treasuryFee +
_stakeFee;
require (repellentSellTotalFee < = 30 , "Fees can not be grater than 30%" );
}
function changeRepellentBuyFees (
uint256 _autoBurnFee,
uint256 _liquidityFee,
uint256 _treasuryFee,
uint256 _stakeFee
) external onlyOwner {
repellentBuyAutoBurnFee = _autoBurnFee;
repellentBuyLiquidityFee = _liquidityFee;
repellentBuyTreasuryFee = _treasuryFee;
repellentBuyStakeFee = _stakeFee;
repellentBuyTotalFee =
_autoBurnFee +
_liquidityFee +
_treasuryFee +
_stakeFee;
require (repellentSellTotalFee < = 20 , "Fees can not be grater than 20%" );
}
function setLpRange (
LPLevels _level,
uint256 _min,
uint256 _max,
uint256 _drop,
uint256 _recover
) external onlyOwner {
LPRange storage currentRange = lpRanges[_level];
currentRange.minLimit = _min;
currentRange.maxLimit = _max;
currentRange.dropLimit = _drop;
currentRange.recoverLimit = _recover;
}
function calculateLPStatus ( ) internal {
uint256 lpBnbBalance = IERC20(router.WETH()).balanceOf(address (pair));
uint256 lpBalance = getBnbPrice(lpBnbBalance);
if (
lpBalance > = lpRanges[LPLevels.Level1].minLimit & &
lpBalance < = lpRanges[LPLevels.Level1].maxLimit
) currentLpLevel = LPLevels.Level1;
if (
lpBalance > = lpRanges[LPLevels.Level2].minLimit & &
lpBalance < = lpRanges[LPLevels.Level2].maxLimit
) currentLpLevel = LPLevels.Level2;
if (
lpBalance > = lpRanges[LPLevels.Level3].minLimit & &
lpBalance < = lpRanges[LPLevels.Level3].maxLimit
) currentLpLevel = LPLevels.Level3;
if (
lpBalance > = lpRanges[LPLevels.Level4].minLimit & &
lpBalance < = lpRanges[LPLevels.Level4].maxLimit
) currentLpLevel = LPLevels.Level4;
if (lpBalance > = lpRanges[LPLevels.Level5].minLimit)
currentLpLevel = LPLevels.Level5;
if (lastLPAmount > lpBalance & & ! isRepellentFee) {
uint256 lpDifference = lastLPAmount - lpBalance;
uint256 differencePercentage = ((lpDifference * 10000 ) /
lastLPAmount);
if (differencePercentage > lpRanges[currentLpLevel].dropLimit) {
isRepellentFee = true ;
repellentFeeActivatedAt = block .timestamp ;
lastRepellentFeeActivatedAt = block .timestamp ;
repellentFeeActivatedAmount = lpBalance;
repellentFeeRecoverAmount =
lpBalance +
((lpBalance * lpRanges[currentLpLevel].recoverLimit) /
10000 );
emit RepellentFeeActivated(lpBalance);
}
}
if (isRepellentFee & & lpBalance > repellentFeeRecoverAmount) {
isRepellentFee = false ;
repellentFeeActivatedAt = 0 ;
repellentFeeActivatedAmount = 0 ;
repellentFeeRecoverAmount = 0 ;
lastRepellentFeeRecoveredAt = block .timestamp ;
lastLPAmount = lpBalance;
emit RepellentFeeDisabled(lpBalance);
}
}
function getBnbPrice (uint256 _amount ) public view returns (uint256 ) {
address [] memory path = new address [](2 );
path[0 ] = router.WETH();
path[1 ] = BUSD;
uint256 [] memory amounts = router.getAmountsOut(_amount, path);
return amounts[1 ];
}
function changeMaxWallet (uint256 _amount ) external onlyOwner {
require (
_amount > = ((_totalSupply * 2 ) / 100 ),
"Max wallet can not less than 2%"
);
maxWallet = _amount;
}
function changeMaxTx (uint256 _amount ) external onlyOwner {
require (
_amount > = ((_totalSupply * 1 ) / 100 ),
"Max wallet can not less than 1%"
);
maxTreansaction = _amount;
}
function maxWalletExclude (
address _wallet,
bool _status
) external onlyOwner {
isMaxWalletExcluded[_wallet] = _status;
}
function maxTxExclude (address _wallet, bool _status ) external onlyOwner {
isMaxTxExcluded[_wallet] = _status;
}
function toggleReppelent (bool _status ) external onlyOwner {
isRepellentEnabled = _status;
}
function changeStakeAddress (address _stakePool ) external onlyOwner {
stakingWallet = _stakePool;
}
}
File 7 of 7: Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol" ;
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred (address indexed previousOwner, address indexed newOwner ) ;
constructor ( ) {
_transferOwnership(_msgSender());
}
modifier onlyOwner ( ) {
_checkOwner();
_ ;
}
function owner ( ) public view virtual returns (address ) {
return _owner;
}
function _checkOwner ( ) internal view virtual {
require (owner() = = _msgSender(), "Ownable: caller is not the owner" );
}
function renounceOwnership ( ) public virtual onlyOwner {
_transferOwnership(address (0 ));
}
function transferOwnership (address newOwner ) public virtual onlyOwner {
require (newOwner ! = address (0 ), "Ownable: new owner is the zero address" );
_transferOwnership(newOwner);
}
function _transferOwnership (address newOwner ) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
{
"compilationTarget" : {
"contracts/Lock.sol" : "Stakify"
} ,
"evmVersion" : "paris" ,
"libraries" : { } ,
"metadata" : {
"bytecodeHash" : "ipfs"
} ,
"optimizer" : {
"enabled" : true ,
"runs" : 200
} ,
"remappings" : [ ]
} [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"AddAuthorizedWallet","type":"event"},{"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":false,"internalType":"uint256","name":"amountBNB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBOG","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"DoContractSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"activatedAmount","type":"uint256"}],"name":"RepellentFeeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"disabledAmount","type":"uint256"}],"name":"RepellentFeeDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetDoContractSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetIsFeeExempt","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":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","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":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyStakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_stakeFee","type":"uint256"}],"name":"changeBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"changeGetFeesOnTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hours","type":"uint256"}],"name":"changeLpCheckFrequency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"changeMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"changeMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoBurnFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_stakeFee","type":"uint256"}],"name":"changeRepellentBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoBurnFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_stakeFee","type":"uint256"}],"name":"changeRepellentSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_stakeFee","type":"uint256"}],"name":"changeSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakePool","type":"address"}],"name":"changeStakeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"changeTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentLpLevel","outputs":[{"internalType":"enum Stakify.LPLevels","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getBnbPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isFeeExcluded","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":[],"name":"isRepellentEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRepellentFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLPAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLPCheckedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRepellentFeeActivatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRepellentFeeRecoveredAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchtAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpCheckFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Stakify.LPLevels","name":"","type":"uint8"}],"name":"lpRanges","outputs":[{"internalType":"uint256","name":"minLimit","type":"uint256"},{"internalType":"uint256","name":"maxLimit","type":"uint256"},{"internalType":"uint256","name":"dropLimit","type":"uint256"},{"internalType":"uint256","name":"recoverLimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTreansaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"maxTxExclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"maxWalletExclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"repellentBuyAutoBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentBuyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentBuyStakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentBuyTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentBuyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentFeeActivatedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentFeeActivatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentFeeRecoverAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentSellAutoBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentSellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentSellStakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentSellTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"repellentSellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescueEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellStakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAuthorizedWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setDoContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Stakify.LPLevels","name":"_level","type":"uint8"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_drop","type":"uint256"},{"internalType":"uint256","name":"_recover","type":"uint256"}],"name":"setLpRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"toggleReppelent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]