S Price: $0.726265 (-0.18%)

Contract Diff Checker

Contract Name:
SonicTaxToken

Contract Source Code:

File 1 of 1 : SonicTaxToken

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

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);
    
    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }
    
    function owner() public view returns (address) {
        return _owner;
    }
    
    modifier onlyOwner() {
        require(msg.sender == _owner, "Ownable: caller is not the owner");
        _;
    }
    
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

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");
        return a - b;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
    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;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function addLiquidityETH(
        address token,
        bool stable,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
}
contract SonicTaxToken is IERC20, Ownable   {
    using SafeMath for uint256;
    using Address for address;
    
    string private _name = "SonicTaxToken";
    string private _symbol = "STT";
    uint8 private _decimals = 18;
    uint256 private _totalSupply = 1_000_000 * 10**_decimals;
    
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFees;
    
    uint256 public marketingTax = 2;
    uint256 public dividendTax = 3;
    address payable public marketingWallet = payable(0x9d33877376eA12bc31DF42F321178d868984aa93);
    
    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x1D368773735ee1E678950B7A97bcA2CafB330CDc);
    address public immutable wrappedSonic = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38;
    address[] private holders;
    mapping(address => bool) private isHolder;
    
    constructor() payable {
        _balances[address(this)] = _totalSupply;
        _isExcludedFromFees[msg.sender] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[0x1D368773735ee1E678950B7A97bcA2CafB330CDc] = true;
        emit Transfer(address(0), address(this), _totalSupply);
    }
    

    function name() public view returns (string memory) {
        return _name;
    }
    
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    
    function decimals() public view returns (uint8) {
        return _decimals;
    }


      function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }
    
    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) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }
    
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "Approve from zero address");
        require(spender != address(0), "Approve to zero address");
        
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

   function swapAndSendToMarketing(uint256 marketingAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = wrappedSonic;

        _approve(address(this), address(uniswapV2Router), marketingAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            marketingAmount,
            0,
            path,
            marketingWallet,
            block.timestamp
        );
    }
    
    function distributeDividends(uint256 dividendAmount) internal {
        uint256 totalSupplyExcludingContract = _totalSupply.sub(_balances[address(this)]);
        if (totalSupplyExcludingContract == 0) return;

        uint256 threshold = _totalSupply.div(10000); // 0.01% of supply
        uint256 amountPerHolder = dividendAmount.div(holders.length);
        for (uint i = 0; i < holders.length; i++) {
            address holder = holders[i];
            if (_balances[holder] >= threshold) {
                payable(holder).transfer(amountPerHolder);
            }
        }
    }

    
    
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "Transfer from zero address");
        require(recipient != address(0), "Transfer to zero address");
        
        uint256 marketingAmount = amount.mul(marketingTax).div(100);
        uint256 dividendAmount = amount.mul(dividendTax).div(100);
        uint256 transferAmount = amount.sub(marketingAmount).sub(dividendAmount);
        
        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(transferAmount);
        _balances[address(this)] = _balances[address(this)].add(marketingAmount).add(dividendAmount);
        
        emit Transfer(sender, recipient, transferAmount);
        emit Transfer(sender, address(this), marketingAmount.add(dividendAmount));
        
        swapAndSendToMarketing(marketingAmount);
        distributeDividends(dividendAmount);
    }

     function setTaxes(uint256 _marketingTax, uint256 _dividendTax) public onlyOwner {
        
        marketingTax = _marketingTax;
        dividendTax = _dividendTax;
    }

    function rescueERC20(address token) external  {
        require(msg.sender == marketingWallet);
         uint256 amount = IERC20(token).balanceOf(address(this));
        require(amount > 0, "No tokens to rescue");
        IERC20(token).transfer(owner(), amount);
    }
    
    function manualSend() external onlyOwner {
         uint256 amount = address(this).balance;
        require(amount > 0, "No ETH to send");
        payable(owner()).transfer(amount);
    }

    function addLiquidity(bool stable) external onlyOwner {
        uint256 tokenAmount = balanceOf(address(this));
        uint256 ethAmount = address(this).balance;
       

        _approve(address(this), address(uniswapV2Router), tokenAmount);
        
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            stable,
            tokenAmount,
            0,
            0,
            msg.sender,
            block.timestamp + 300
        );
    }
}

Please enter a contract address above to load the contract details and source code.

Context size (optional):