Suprisingly Ingenious Goats Mega Alpha (SIGMA)

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 {}
}

Tags:
ERC20, DeFi, Burnable, Swap, Liquidity|addr:0x4511a31b6320b851e5754094e848044520bd1a1a|verified:true|block:23678949|tx:0x890bfa5a282b8470f9ae11407ad7da18b39cbdb92e506ce2e8b8e77919b3405d|first_check:1761727249

Submitted on: 2025-10-29 09:40:49

Comments

Log in to comment.

No comments yet.