Description:
Decentralized Finance (DeFi) protocol contract providing Burnable, Swap, Liquidity functionality.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
// SPDX-License-Identifier: MIT
/**
*/
pragma solidity = 0.8.24;
interface IERC20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function getOwner() external view returns (address);
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);
event Burn(address indexed from, address indexed to, uint256 value);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) { return msg.sender; }
}
abstract contract Ownable is Context {
address private _owner;
address internal ZERO = 0x0000000000000000000000000000000000000000;
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(ZERO); }
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != ZERO, "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IDEXFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IDEXRouter {
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 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;
}
contract SURPRISINGLYINGENIOUSGOATSMEGAALPHA is IERC20, Ownable {
address private immutable WETH;
address public immutable pair;
IDEXRouter private constant router =
IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
string private constant _name = "Suprisingly Ingenious Goats Mega Alpha";
string private constant _symbol = "SIGMA";
uint8 private constant _decimals = 18;
uint private constant TOTAL_SUPPLY = 1 * 10 ** 9 * (10 ** uint(_decimals));
uint public swapThreshold = TOTAL_SUPPLY / 1000; // Starting at 0.1%
uint32 public launchedAt;
// All fees are in basis points (100 = 1%)
uint private _buyGrowth = 500;
uint private _sellGrowth = 500;
address public growthWallet = 0x4a297482FD62932f076D24BC7d492cb7C86e8f76;
bool private _inSwapAndLiquify;
bool public swapAndLiquifyEnabled = true;
bool public tradingOpen;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) public isFeeExempt;
modifier lockTheSwap() {
_inSwapAndLiquify = true;
_;
_inSwapAndLiquify = false;
}
//Event Logs
event GrowthWalletUpdated(address indexed _newWallet);
event BuyFeesUpdated(uint16 _newGrowth);
event SellFeesUpdated(uint16 _newGrowth);
event StuckETHCleared(uint256 _amount);
event StuckTokensCleared(address _token, uint256 _amount);
event FeeExemptionChanged(address indexed _exemptWallet, bool _exempt);
event SwapbackSettingsChanged(bool _enabled, uint256 _newSwapbackAmount);
event Launched();
event StuckETH(uint256 _amount);
error InvalidAddress();
error InvalidAmount();
error InvalidFee();
error InsufficientAllowance();
error Unavailable();
error TransferFromZeroAddress();
error TransferToZeroAddress();
constructor() payable {
uint _TOTAL_SUPPLY = TOTAL_SUPPLY;
WETH = router.WETH();
pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
_allowances[address(this)][address(router)] = type(uint256).max;
isFeeExempt[owner()] = true;
isFeeExempt[growthWallet] = true;
isFeeExempt[address(this)] = true;
_balances[owner()] = _TOTAL_SUPPLY;
emit Transfer(ZERO, owner(), _TOTAL_SUPPLY);
}
function launchSequence() external payable onlyOwner {
if (launchedAt != 0) revert Unavailable();
launchedAt = uint32(block.number);
tradingOpen = true;
emit Launched();
}
//Basic Functions
function getCirculatingSupply() external view returns (uint) { return TOTAL_SUPPLY - balanceOf(DEAD) - balanceOf(ZERO); }
function totalSupply() external pure override returns (uint) { return TOTAL_SUPPLY; }
function decimals() external pure override returns (uint8) { return _decimals; }
function symbol() external pure override returns (string memory) { return _symbol; }
function name() external pure override returns (string memory) { return _name; }
function getOwner() external view override returns (address) { return owner(); }
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 approveMax(address spender) external returns (bool) { return approve(spender, type(uint256).max); }
function baseBuyFee() external view returns (uint) { return _buyGrowth; }
function baseSellFee() external view returns (uint) { return _sellGrowth; }
//Transfer Functions
function transfer(address recipient, uint256 amount) external override returns (bool) {
return _transfer(msg.sender, recipient, amount);
}
function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
uint amtAllowed = _allowances[sender][msg.sender];
if (amtAllowed != type(uint256).max) {
if (amount > amtAllowed) {
revert InsufficientAllowance();
}
}
if (amtAllowed != type(uint256).max) {
amtAllowed = amtAllowed - amount;
}
return _transfer(sender, recipient, amount);
}
function _transfer(address sender, address recipient, uint256 amount) private returns (bool) {
bool inSwapAndLiquify = _inSwapAndLiquify;
address _ZERO = ZERO;
if (sender == _ZERO) revert TransferFromZeroAddress();
if (recipient == _ZERO) revert TransferToZeroAddress();
if (amount == 0) revert InvalidAmount();
if (inSwapAndLiquify) {
return _basicTransfer(sender, recipient, amount);
}
if (isFeeExempt[sender] || isFeeExempt[recipient]) {
return _basicTransfer(sender, recipient, amount);
}
if (!tradingOpen) revert Unavailable();
if(msg.sender != pair && !inSwapAndLiquify && swapAndLiquifyEnabled && _balances[address(this)] >= swapThreshold){ _swapBack(); }
_balances[sender] = _balances[sender] - amount;
uint256 finalAmount = takeFee(sender, recipient, amount);
_balances[recipient] = _balances[recipient] + finalAmount;
emit Transfer(sender, recipient, finalAmount);
return true;
}
function _basicTransfer(address sender, address recipient, uint256 amount) private returns (bool) {
_balances[sender] = _balances[sender] - amount;
_balances[recipient] = _balances[recipient] + amount;
emit Transfer(sender, recipient, amount);
return true;
}
//Tax Functions
function takeFee(address sender, address recipient, uint256 amount) internal returns (uint256) {
uint growthTaxB = amount * _buyGrowth / 10000;
uint growthTaxS = amount * _sellGrowth / 10000;
uint taxToGet;
if(sender == pair) {
taxToGet = growthTaxB;
}
if(recipient == pair) {
taxToGet = growthTaxS;
}
_balances[address(this)] = _balances[address(this)] + taxToGet;
emit Transfer(sender, address(this), taxToGet);
return amount - taxToGet;
}
//LP and Swapback Functions
function _swapTokensForETH(
uint256 tokenAmount
) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = router.WETH();
approve(address(this), tokenAmount);
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function _swapBack() private lockTheSwap {
uint tokenBalance = _balances[address(this)];
_swapTokensForETH(tokenBalance);
uint totalETHBalance = address(this).balance;
if (totalETHBalance != 0) {
_transferETHToGrowth(totalETHBalance);
}
}
function manualSwapBack() external onlyOwner {
_swapBack();
}
// Update/Change Functions
function changeIsFeeExempt(address holder, bool exempt) external payable onlyOwner {
isFeeExempt[holder] = exempt;
emit FeeExemptionChanged(holder, exempt);
}
function setGrowthWallet(address newGrowthWallet) external payable onlyOwner {
if(newGrowthWallet == ZERO || newGrowthWallet == address(this)) revert InvalidAddress();
isFeeExempt[growthWallet] = false;
growthWallet = newGrowthWallet;
isFeeExempt[newGrowthWallet] = true;
emit GrowthWalletUpdated(newGrowthWallet);
}
function changeSwapBackSettings(bool enableSwapback, uint256 newSwapbackLimit) external payable onlyOwner {
if (newSwapbackLimit <= 1000) revert InvalidAmount();
swapAndLiquifyEnabled = enableSwapback;
swapThreshold = newSwapbackLimit;
emit SwapbackSettingsChanged(enableSwapback, newSwapbackLimit);
}
function updateFees(uint16 newBuyGrowthFee, uint16 newSellGrowthFee) external payable onlyOwner {
uint totalNewBuyFee = newBuyGrowthFee;
uint totalNewSellFee = newSellGrowthFee;
if (totalNewBuyFee > 500 || totalNewSellFee > 500)
revert InvalidFee();
_buyGrowth = newBuyGrowthFee;
_sellGrowth = newSellGrowthFee;
emit BuyFeesUpdated(newBuyGrowthFee);
emit SellFeesUpdated(newSellGrowthFee);
}
function clearStuckETH() external payable onlyOwner {
uint contractETHBalance = address(this).balance;
if (contractETHBalance == 0) revert InvalidAmount();
_transferETHToGrowth(contractETHBalance);
emit StuckETHCleared(contractETHBalance);
}
function clearStuckTokens(IERC20 token) external payable onlyOwner {
if (address(token) == ZERO) revert InvalidAddress();
uint balance = token.balanceOf(address(this));
if (balance == 0) revert InvalidAmount();
token.transfer(growthWallet, balance);
emit StuckTokensCleared(address(token), balance);
}
function _transferETHToGrowth(uint256 amount) private {
(bool success, ) = growthWallet.call{value: amount}("");
if (!success) {
/// @dev owner can claim ETH via clearStuckETH()
emit StuckETH(amount);
}
}
receive() external payable {}
}
Submitted on: 2025-10-29 09:40:49
Comments
Log in to comment.
No comments yet.