Address
0x41e1ef16ff3dea3b9c10e99077bc91ef607e0e4eCurrent Holdings
$0.00
TXs sent
not counted
First Active
2023-05-13
block 17,251,694
Last Active
97 days ago
block 26,744,550
Net worth historyi
5 snapshots · to block 27,497,242coverage change 26 Augcoverage change 27 Augcoverage change 27 Augcoverage change 27 Augcoverage change 27 Aug
exact matchFOMCsolc 0.8.10+commit.fc410830runtime exact · creation exact
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
contract FOMC is ERC20, Ownable {
using SafeMath for uint256;
IUniswapV2Router02 public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
address public constant deadAddress = address(0xdead);
address public routerCA = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D uniswap
bool private swapping;
address public mktgWallet;
address public devWallet;
address public liqWallet;
address public operationsWallet;
uint256 public maxTransactionAmount;
uint256 public swapTokensAtAmount;
uint256 public maxWallet;
bool public limitsInEffect = true;
bool public tradingActive = false;
bool public swapEnabled = false;
// Anti-bot and anti-whale mappings and variables
mapping(address => uint256) private _holderLastTransferTimestamp;
bool public transferDelayEnabled = true;
uint256 private launchBlock;
uint256 private deadBlocks;
mapping(address => bool) public blocked;
uint256 public buyTotalFees;
uint256 public buyMktgFee;
uint256 public buyLiquidityFee;
uint256 public buyDevFee;
uint256 public buyOperationsFee;
uint256 public sellTotalFees;
uint256 public sellMktgFee;
uint256 public sellLiquidityFee;
uint256 public sellDevFee;
uint256 public sellOperationsFee;
uint256 public tokensForMktg;
uint256 public tokensForLiquidity;
uint256 public tokensForDev;
uint256 public tokensForOperations;
mapping(address => bool) private _isExcludedFromFees;
mapping(address => bool) public _isExcludedMaxTransactionAmount;
mapping(address => bool) public automatedMarketMakerPairs;
event UpdateUniswapV2Router(
address indexed newAddress,
address indexed oldAddress
);
event ExcludeFromFees(address indexed account, bool isExcluded);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event mktgWalletUpdated(
address indexed newWallet,
address indexed oldWallet
);
event devWalletUpdated(
address indexed newWallet,
address indexed oldWallet
);
event liqWalletUpdated(
address indexed newWallet,
address indexed oldWallet
);
event operationsWalletUpdated(
address indexed newWallet,
address indexed oldWallet
);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiquidity
);
constructor() ERC20("FOMC", "FOMC") {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(routerCA);
excludeFromMaxTransaction(address(_uniswapV2Router), true);
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(address(this), _uniswapV2Router.WETH());
excludeFromMaxTransaction(address(uniswapV2Pair), true);
_setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
// launch buy fees
uint256 _buyMktgFee = 0;
uint256 _buyLiquidityFee = 0;
uint256 _buyDevFee = 0;
uint256 _buyOperationsFee = 0;
// launch sell fees
uint256 _sellMktgFee = 2;
uint256 _sellLiquidityFee = 0;
uint256 _sellDevFee = 0;
uint256 _sellOperationsFee = 0;
uint256 totalSupply = 31_380_000_000_000 * 1e18;
maxTransactionAmount = totalSupply / 10000; // 0.01% max txn
maxWallet = (totalSupply * 5) / 10000; // 0.05% max wallet
swapTokensAtAmount = totalSupply / 10000; // 0.01% swap wallet
buyMktgFee = _buyMktgFee;
buyLiquidityFee = _buyLiquidityFee;
buyDevFee = _buyDevFee;
buyOperationsFee = _buyOperationsFee;
buyTotalFees =
buyMktgFee +
buyLiquidityFee +
buyDevFee +
buyOperationsFee;
sellMktgFee = _sellMktgFee;
sellLiquidityFee = _sellLiquidityFee;
sellDevFee = _sellDevFee;
sellOperationsFee = _sellOperationsFee;
sellTotalFees =
sellMktgFee +
sellLiquidityFee +
sellDevFee +
sellOperationsFee;
mktgWallet = address(0x80c934F0BC61fD431DD33CA2fc6e1FB6D34C8483);
devWallet = address(0x80c934F0BC61fD431DD33CA2fc6e1FB6D34C8483);
liqWallet = address(0x80c934F0BC61fD431DD33CA2fc6e1FB6D34C8483);
operationsWallet = address(0x80c934F0BC61fD431DD33CA2fc6e1FB6D34C8483);
// exclude from paying fees or having max transaction amount
excludeFromFees(owner(), true);
excludeFromFees(address(this), true);
excludeFromFees(address(0xdead), true);
excludeFromMaxTransaction(owner(), true);
excludeFromMaxTransaction(address(this), true);
excludeFromMaxTransaction(address(0xdead), true);
_mint(msg.sender, totalSupply);
}
receive() external payable {}
function enableTrading(uint256 _deadBlocks) external onlyOwner {
require(!tradingActive, "Token launched");
tradingActive = true;
launchBlock = block.number;
swapEnabled = true;
deadBlocks = _deadBlocks;
}
// remove limits after token is stable
function removeLimits() external onlyOwner returns (bool) {
limitsInEffect = false;
return true;
}
// disable Transfer delay - cannot be reenabled
function disableTransferDelay() external onlyOwner returns (bool) {
transferDelayEnabled = false;
return true;
}
// change the minimum amount of tokens to sell from fees
function updateSwapTokensAtAmount(
uint256 newAmount
) external onlyOwner returns (bool) {
require(
newAmount >= (totalSupply() * 1) / 100000,
"Swap amount cannot be lower than 0.001% total supply."
);
require(
newAmount <= (totalSupply() * 5) / 1000,
"Swap amount cannot be higher than 0.5% total supply."
);
swapTokensAtAmount = newAmount;
return true;
}
function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
require(
newNum >= ((totalSupply() * 1) / 1000) / 1e18,
"Cannot set maxTransactionAmount lower than 0.1%"
);
maxTransactionAmount = newNum * (10 ** 18);
}
function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
require(
newNum >= ((totalSupply() * 5) / 1000) / 1e18,
"Cannot set maxWallet lower than 0.5%"
);
maxWallet = newNum * (10 ** 18);
}
function excludeFromMaxTransaction(
address updAds,
bool isEx
) public onlyOwner {
_isExcludedMaxTransactionAmount[updAds] = isEx;
}
// only use to disable contract sales if absolutely necessary (emergency use only)
function updateSwapEnabled(bool enabled) external onlyOwner {
swapEnabled = enabled;
}
function updateBuyFees(
uint256 _mktgFee,
uint256 _liquidityFee,
uint256 _devFee,
uint256 _operationsFee
) external onlyOwner {
buyMktgFee = _mktgFee;
buyLiquidityFee = _liquidityFee;
buyDevFee = _devFee;
buyOperationsFee = _operationsFee;
buyTotalFees =
buyMktgFee +
buyLiquidityFee +
buyDevFee +
buyOperationsFee;
require(buyTotalFees <= 99);
}
function updateSellFees(
uint256 _mktgFee,
uint256 _liquidityFee,
uint256 _devFee,
uint256 _operationsFee
) external onlyOwner {
sellMktgFee = _mktgFee;
sellLiquidityFee = _liquidityFee;
sellDevFee = _devFee;
sellOperationsFee = _operationsFee;
sellTotalFees =
sellMktgFee +
sellLiquidityFee +
sellDevFee +
sellOperationsFee;
require(sellTotalFees <= 99);
}
function excludeFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
function setAutomatedMarketMakerPair(
address pair,
bool value
) public onlyOwner {
require(
pair != uniswapV2Pair,
"The pair cannot be removed from automatedMarketMakerPairs"
);
_setAutomatedMarketMakerPair(pair, value);
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
automatedMarketMakerPairs[pair] = value;
emit SetAutomatedMarketMakerPair(pair, value);
}
function updatemktgWallet(address newmktgWallet) external onlyOwner {
emit mktgWalletUpdated(newmktgWallet, mktgWallet);
mktgWallet = newmktgWallet;
}
function updateDevWallet(address newWallet) external onlyOwner {
emit devWalletUpdated(newWallet, devWallet);
devWallet = newWallet;
}
function updateoperationsWallet(address newWallet) external onlyOwner {
emit operationsWalletUpdated(newWallet, operationsWallet);
operationsWallet = newWallet;
}
function updateLiqWallet(address newLiqWallet) external onlyOwner {
emit liqWalletUpdated(newLiqWallet, liqWallet);
liqWallet = newLiqWallet;
}
function isExcludedFromFees(address account) public view returns (bool) {
return _isExcludedFromFees[account];
}
event BoughtEarly(address indexed sniper);
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(!blocked[from], "Sniper blocked");
if (amount == 0) {
super._transfer(from, to, 0);
return;
}
if (limitsInEffect) {
if (
from != owner() &&
to != owner() &&
to != address(0) &&
to != address(0xdead) &&
!swapping
) {
if (!tradingActive) {
require(
_isExcludedFromFees[from] || _isExcludedFromFees[to],
"Trading is not active."
);
}
if (
block.number <= launchBlock + deadBlocks &&
from == address(uniswapV2Pair) &&
to != routerCA &&
to != address(this) &&
to != address(uniswapV2Pair)
) {
blocked[to] = true;
emit BoughtEarly(to);
}
// at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
if (transferDelayEnabled) {
if (
to != owner() &&
to != address(uniswapV2Router) &&
to != address(uniswapV2Pair)
) {
require(
_holderLastTransferTimestamp[tx.origin] <
block.number,
"_transfer:: Transfer Delay enabled. Only one purchase per block allowed."
);
_holderLastTransferTimestamp[tx.origin] = block.number;
}
}
//when buy
if (
automatedMarketMakerPairs[from] &&
!_isExcludedMaxTransactionAmount[to]
) {
require(
amount <= maxTransactionAmount,
"Buy transfer amount exceeds the maxTransactionAmount."
);
require(
amount + balanceOf(to) <= maxWallet,
"Max wallet exceeded"
);
}
//when sell
else if (
automatedMarketMakerPairs[to] &&
!_isExcludedMaxTransactionAmount[from]
) {
require(
amount <= maxTransactionAmount,
"Sell transfer amount exceeds the maxTransactionAmount."
);
} else if (!_isExcludedMaxTransactionAmount[to]) {
require(
amount + balanceOf(to) <= maxWallet,
"Max wallet exceeded"
);
}
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if (
canSwap &&
swapEnabled &&
!swapping &&
!automatedMarketMakerPairs[from] &&
!_isExcludedFromFees[from] &&
!_isExcludedFromFees[to]
) {
swapping = true;
swapBack();
swapping = false;
}
bool takeFee = !swapping;
// if any account belongs to _isExcludedFromFee account then remove the fee
if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
uint256 fees = 0;
// only take fees on buys/sells, do not take on wallet transfers
if (takeFee) {
// on sell
if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
fees = amount.mul(sellTotalFees).div(100);
tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
tokensForDev += (fees * sellDevFee) / sellTotalFees;
tokensForMktg += (fees * sellMktgFee) / sellTotalFees;
tokensForOperations +=
(fees * sellOperationsFee) /
sellTotalFees;
}
// on buy
else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
fees = amount.mul(buyTotalFees).div(100);
tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
tokensForDev += (fees * buyDevFee) / buyTotalFees;
tokensForMktg += (fees * buyMktgFee) / buyTotalFees;
tokensForOperations += (fees * buyOperationsFee) / buyTotalFees;
}
if (fees > 0) {
super._transfer(from, address(this), fees);
}
amount -= fees;
}
super._transfer(from, to, amount);
}
function swapTokensForEth(uint256 tokenAmount) private {
// generate the uniswap pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
// make the swap
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this),
block.timestamp
);
}
function multiBlock(
address[] calldata blockees,
bool shouldBlock
) external onlyOwner {
for (uint256 i = 0; i < blockees.length; i++) {
address blockee = blockees[i];
if (
blockee != address(this) &&
blockee != routerCA &&
blockee != address(uniswapV2Pair)
) blocked[blockee] = shouldBlock;
}
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
// approve token transfer to cover all possible scenarios
_approve(address(this), address(uniswapV2Router), tokenAmount);
// add the liquidity
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // slippage is unavoidable
0, // slippage is unavoidable
liqWallet,
block.timestamp
);
}
function swapBack() private {
uint256 contractBalance = balanceOf(address(this));
uint256 totalTokensToSwap = tokensForLiquidity +
tokensForMktg +
tokensForDev +
tokensForOperations;
bool success;
if (contractBalance == 0 || totalTokensToSwap == 0) {
return;
}
if (contractBalance > swapTokensAtAmount * 20) {
contractBalance = swapTokensAtAmount * 20;
}
// Halve the amount of liquidity tokens
uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
totalTokensToSwap /
2;
uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
uint256 initialETHBalance = address(this).balance;
swapTokensForEth(amountToSwapForETH);
uint256 ethBalance = address(this).balance.sub(initialETHBalance);
uint256 ethForMktg = ethBalance.mul(tokensForMktg).div(
totalTokensToSwap
);
uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);
uint256 ethForOperations = ethBalance.mul(tokensForOperations).div(
totalTokensToSwap
);
uint256 ethForLiquidity = ethBalance -
ethForMktg -
ethForDev -
ethForOperations;
tokensForLiquidity = 0;
tokensForMktg = 0;
tokensForDev = 0;
tokensForOperations = 0;
(success, ) = address(devWallet).call{value: ethForDev}("");
if (liquidityTokens > 0 && ethForLiquidity > 0) {
addLiquidity(liquidityTokens, ethForLiquidity);
emit SwapAndLiquify(
amountToSwapForETH,
ethForLiquidity,
tokensForLiquidity
);
}
(success, ) = address(operationsWallet).call{value: ethForOperations}(
""
);
(success, ) = address(mktgWallet).call{value: address(this).balance}(
""
);
}
}