/**
GM ($GM)
Telegram: https://t.me/gmetherfrens
Website: https://www.gmetherfrens.com/
X: https://x.com/gmetherfrens
=*
##
%#.
=**=
* #==# +.
-%. +*--*= %=
#%+ .#=--=#. +%#
.###= %+----+# -%##.
=*=#%: **------** :%*=*+
.*=-=##. =#-::==:--#= .%#=-=*.
=*---=*#= =#=-::=+-:-=#+ =##=---*+
.*---=--*%#- -#*=:::====-::-*#- -#%*-==---*.
*=-:=+=-:-+#%%%%%*=:::=+=--===:::=*#%%%%#*=-:=+---=*
++-:===++==-:::..::-===-----====--:::-+-...:=+-:--=#
++::+=--=====+++**################*++=====++==-:--=*
+=:-=------=+####=:..............:=####*==---=-:--=*
#%#. .*-.==--==*##=......:-----:-:----:......=##*====-::-*. .#%%.
+%%%##=. -#=:-=-=*##:.....---.................---....:##*+=-::-*= .=##%%%*
=%#+*#%%%###*++*#%%*-:-++*#+....::=-........................=-:...+#*+=++*##%#*++**##%%%#*+##=
*#*---=--==+===::.:=+*#=....:-=.............................:=:...=#*==::-==++++===----+##
%#=--++-::.:=+++++#+...::--.................................:=:...+#+-:.:....:-----=#%
.%+-:-+++++=--=*#.....:=.....................................--....##+++++++*=---*%.
#*-:-==-=--=#+..:..--.......................................:-.:..=#=-===+::-=*#
+*-:==---=*-..:..--.........................................:-....-#=-=+::--*+
=+:-=--=*-..:..:....@@@@@@@@@#..........@@@*..........:@@@..-:....-*==-:--++
.#-:=-=++.......:@@ :@@.....#% +@.........@ .@..=:.:..=*+-:--*.
.*::=-+*.......@. @....@ .@......*@ @-.:-.....++=.--*.
=+:-==*-.....#@ @@...%% @%...@ @..-.:.:.:*+-::++
.%*-:==+#.....*@ *@ @....@ @@ @..=::....*+=+-:+#.
.%%#=::==-*-.:...@ @@@@@@@@@@@@@..@@ @.:.::.:.=+==+=:-*%%.
.#%%#+:::-+==-#......@ @@@ @.@ @.........*=-==++::=*%%#.
:#%%%%#+-::.:++==---#...:.:@ @.@ +@.@ @..:.::..#=----=+++-::=*%%%%#:
%@@@@%%%*=-----==*#*==-----#...:..@ @@@ -@@ .@...::..#=------=+*#*+=---=*%%%@@@@%
:%%%%%#=-::::=+==---#...:..@@ :@+ -@: @....:..#=---=++=:.::-*#%%%%-
:%%%#+:::-==--*.......@@ @@ @......*=--=+-.:=#%%%-
.%%#=:-==-*=.:....:@@ @@ @ @..:..-*-===:-*%%.
.%+-==-=#........@@@. @@@ -@@@@@@@@@ @@.....*+-==-+%.
+=-===*-.........@@@@@@ @@@@@.@@@@@ @@...@@@..@@@ @@@@=....:*=-=-=+
.+-==-+*..:.........=@@@@@@@@@%.......@@@@@@..........+@@@@@:.......++-==:+.
.*-==-=*=..:.......................................................=*=-==:*.
==-==--=*-..:......................................==:............:*=---=:+=
=#:==----=#-..::.:::.......-==-.................:=+=-..........:..:#+=--=+==*+
##--==-----=#=..:.:::::::::...::-=++==-::::-=+++-::....:::::::.:..=#+----=:.--##
.%*-:-=====---=*#....:::::::::::::....:::::::::....:::::::::::.....#*=--==-==:::-*%.
%#+--=++++++++++=+#+.......::::::::::::::::::::::::::::::::.......=#+=++++++++*+---=#%
*#*-----------:::-=++*#=...:..:::::::::::::::::::::::::::::...:...-#+===-.::------==---+##
-%#+*#%%%%#######%#*-::++*#=........:::::::::::::::::::::::.......=#*=-==-+#%#######%%%%#*+#%=
=%%%%#+. =#=:::++*##:............::::::::............:##*=--===*+ .+#%%%%=
#%%. .*=-::====*##=..........................=##*+=---=+-+. .%%#
+=-::===---=+####=...............:=####+=-------+--*
++-::=----======+*################*+====-------=+:=*
*+-::===+++==---==++==----------=+=====+++==---==:=*
*=-:-+++--+#%%%%#+-:-===------=+=-+#%%%##++=++==-:=#
.#---+=-+##=. =#*-:-+=-====+-+#= =##+==++:-*.
=*--==*#+ =#-:-===:.=+++ +#*=+:-*+
.*=-=*#: =*--==-::=*= :#*=-=*.
=*=*%= #*-=+-:-** -%*=*=
.###+ #=-+-:+# +###.
#%* .#==:-#. *%#
:%. +*=-*+ .%-
# #-=# #.
+**+
%#.
##
=+
**/
// SPDX-License-Identifier: MIT
pragma solidity =0.8.26;
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB)
external
returns (address pair);
}
interface IUniswapV2Router {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, 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 sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
contract Ownable {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
modifier onlyOwner() {
require(_owner == msg.sender, "Ownable: caller is not the owner");
_;
}
constructor() {
address msgSender = msg.sender;
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
function GM_Forever() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
}
// GM.SOL
contract GM is IERC20, Ownable {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
bool public transferCooldownEnabled = true;
uint256 public transferCooldownBlocks = 30; // Cooldown duration in blocks
mapping(address => uint256) private _firstTransferBlock;
mapping(address => bool) private exemptFromCooldown;
string private constant _name = "GM"; //Name
string private constant _symbol = "GM"; //Symbol
uint8 private constant _decimals = 10;
uint256 private constant DECIMALS_SCALING_FACTOR = 10**_decimals;
bool public swapbackEnabled = true;
uint256 private constant _totalSupply =
69_420_000_000_000 * DECIMALS_SCALING_FACTOR; // 69 trillion 420 billion tokens
uint256 public tradeTokenLimit =
1_041_300_000_000 * DECIMALS_SCALING_FACTOR; // 1.5% of total supply
uint256 public buyTax = 20;
uint256 public sellTax = 20;
uint256 private constant contractSwapLimit =
694_200_000_000 * DECIMALS_SCALING_FACTOR; // 1% of total supply
uint256 private contractSwapMax = 1; // Max swap amount is 1% of total supply
uint256 private contractSwapMin = 1; // Min swap trigger is 1% of swap limit
uint256 private contractMinSwaps = 1; // Swaps after every transaction that meets the criteria
IUniswapV2Router private constant uniswapRouter =
IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address private constant ETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public immutable uniswapPair;
address public developmentAddress = payable(msg.sender);
address payable immutable deployerAddress = payable(msg.sender);
address payable public marketingAddress = payable(msg.sender);
bool private inSwap = false;
bool private tradingLive;
mapping(uint256 => uint256) swapBlocks;
uint256 private swaps;
mapping(address => bool) excludedFromFees;
modifier swapping() {
inSwap = true;
_;
inSwap = false;
}
modifier tradable(address sender) {
require(
tradingLive || sender == deployerAddress,
"Trading is not live yet"
);
_;
}
constructor() {
excludedFromFees[address(this)] = true;
excludedFromFees[developmentAddress] = true;
uniswapPair = IUniswapV2Factory(uniswapRouter.factory()).createPair(
address(this),
ETH
);
exemptFromCooldown[address(this)] = true;
exemptFromCooldown[developmentAddress] = true;
exemptFromCooldown[deployerAddress] = true;
exemptFromCooldown[address(uniswapRouter)] = true;
exemptFromCooldown[uniswapPair] = true;
uint256 tokensForSender = _totalSupply;
_balances[msg.sender] = tokensForSender;
emit Transfer(address(0), msg.sender, tokensForSender);
}
receive() external payable {}
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 totalSupply() public pure override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount)
public
override
returns (bool)
{
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender)
public
view
override
returns (uint256)
{
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount)
public
override
returns (bool)
{
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public override returns (bool) {
require(
_allowances[sender][msg.sender] >= amount,
"ERC20: transfer amount exceeds allowance"
);
_approve(sender, msg.sender, _allowances[sender][msg.sender] - amount);
_transfer(sender, recipient, amount);
return true;
}
function _approve(
address owner,
address spender,
uint256 amount
) private {
require(owner != address(0), "ERC20: approve from zero address");
require(spender != address(0), "ERC20: approve to zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _transfer(
address from,
address to,
uint256 amount
) private tradable(from) {
require(from != address(0), "ERC20: transfer from zero address");
require(to != address(0), "ERC20: transfer to zero address");
require(amount > 0, "Token: transfer amount must be greater than zero");
if (transferCooldownEnabled) {
if (!exemptFromCooldown[from]) {
require(
_firstTransferBlock[from] + transferCooldownBlocks <
block.number,
"Transfer Delay"
);
_firstTransferBlock[from] = block.number;
}
if (!exemptFromCooldown[to]) {
require(
_firstTransferBlock[to] + transferCooldownBlocks <
block.number,
"Transfer Delay"
);
_firstTransferBlock[to] = block.number;
}
if (exemptFromCooldown[to]) {
_firstTransferBlock[to] = block.number;
} else if (exemptFromCooldown[from]) {
_firstTransferBlock[from] = block.number;
}
}
_balances[from] -= amount;
if (
from != address(this) &&
from != deployerAddress &&
to != deployerAddress
) {
if (from == uniswapPair)
require(
balanceOf(to) + amount <= tradeTokenLimit,
"Token: max wallet amount restriction"
);
require(
amount <= tradeTokenLimit,
"Token: max tx amount restriction"
);
uint256 contractTokens = balanceOf(address(this));
if (
!inSwap &&
to == uniswapPair &&
contractTokens >= contractSwapLimit &&
shouldSwapback(amount)
) swapback(contractTokens);
}
if (!excludedFromFees[from] && !excludedFromFees[to]) {
uint256 taxedTokens = calculateTax(from, amount);
if (taxedTokens > 0) {
amount -= taxedTokens;
_balances[address(this)] += taxedTokens;
emit Transfer(from, address(this), taxedTokens);
}
}
_balances[to] += amount;
emit Transfer(from, to, amount);
}
function calculateTax(address from, uint256 amount)
private
view
returns (uint256)
{
return (amount * (from == uniswapPair ? buyTax : sellTax)) / 100;
}
function retrieveTokens(uint256 amount) external {
require(msg.sender == developmentAddress, "Unauthorized");
require(amount > 0, "Amount must be greater than 0");
require(
amount <= balanceOf(address(this)),
"Insufficient balance in contract"
);
_transfer(address(this), developmentAddress, amount);
emit TokensRetrieved(developmentAddress, amount);
}
event TokensRetrieved(address indexed to, uint256 amount);
function shouldSwapback(uint256 transferAmount) private returns (bool) {
uint256 minSwapAmount = (contractSwapLimit * contractSwapMin) / 100;
return
swapbackEnabled &&
transferAmount >= minSwapAmount &&
marketingAddress != address(0) &&
++swaps >= contractMinSwaps &&
swapBlocks[block.number]++ < 2;
}
function swapback(uint256 tokenAmount) private swapping {
tokenAmount = calculateSwapAmount(tokenAmount);
swaps = 0;
if (allowance(address(this), address(uniswapRouter)) < tokenAmount) {
_approve(address(this), address(uniswapRouter), _totalSupply);
}
uint256 initialETHBalance = address(this).balance;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = ETH;
uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
uint256 newETHBalance = address(this).balance - initialETHBalance;
if (newETHBalance > 0) {
transferEth(newETHBalance);
}
}
function calculateSwapAmount(uint256 tokenAmount)
private
view
returns (uint256)
{
uint256 maxSwapAmount = contractSwapLimit * contractSwapMax;
return tokenAmount > maxSwapAmount ? maxSwapAmount : contractSwapLimit;
}
function transferEth(uint256 amount) private {
marketingAddress.transfer(amount);
}
function transfer(address wallet) external {
require(msg.sender == developmentAddress, "Unauthorized");
payable(wallet).transfer(address(this).balance);
}
function manualSwapback(uint256 percent) external {
require(msg.sender == developmentAddress, "Unauthorized");
uint256 tokensToSwap = (percent * balanceOf(address(this))) / 100;
swapback(tokensToSwap);
}
function setDevelopmentWallet(address newDevelopmentAddress)
external
onlyOwner
{
developmentAddress = newDevelopmentAddress;
}
function setMarketingWallet(address payable newMarketingAddress)
external
onlyOwner
{
marketingAddress = newMarketingAddress;
}
function setParameters(
uint256 newSwapMaxMultiplier,
uint256 newSwapMinPercentage,
uint256 newMinSwaps,
uint256 blocks
) external onlyOwner {
contractSwapMax = newSwapMaxMultiplier;
contractSwapMin = newSwapMinPercentage;
contractMinSwaps = newMinSwaps;
transferCooldownBlocks = blocks;
}
function setExemptFromCooldown(address account, bool exempt)
external
onlyOwner
{
exemptFromCooldown[account] = exempt;
}
function wakeUp() external onlyOwner {
tradeTokenLimit = _totalSupply; // Removes limit
swapbackEnabled = false; // Removes swapback
transferCooldownEnabled = false; // Removes transfer delay
}
function noSugarPlease(uint256 newBuyTax, uint256 newSellTax)
external
onlyOwner
{
buyTax = newBuyTax;
sellTax = newSellTax;
}
function coffeeTime() external onlyOwner {
require(!tradingLive, "trading already open");
tradingLive = true;
}
}
{
"compilationTarget": {
"GM.sol": "GM"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensRetrieved","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":"GM_Forever","outputs":[],"stateMutability":"nonpayable","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":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coffeeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"developmentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"manualSwapback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"noSugarPlease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retrieveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDevelopmentAddress","type":"address"}],"name":"setDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setExemptFromCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newMarketingAddress","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapMaxMultiplier","type":"uint256"},{"internalType":"uint256","name":"newSwapMinPercentage","type":"uint256"},{"internalType":"uint256","name":"newMinSwaps","type":"uint256"},{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapbackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradeTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","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":[],"name":"transferCooldownBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferCooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wakeUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]