S Price: $0.643726 (-13.92%)

Contract Diff Checker

Contract Name:
RobonicToken

Contract Source Code:

File 1 of 1 : RobonicToken

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

contract RobonicToken is Context, IERC20 {
    string private _name = "RobonicToken";
    string private _symbol = "ROBONIC";
    uint8 private _decimals = 18;
    uint256 private _totalSupply = 1000000000 * 10 ** 18;

    uint256 public buyTax = 5;
    uint256 public sellTax = 5;
    uint256 public rewardPool;
    address public taxWallet;
    uint256 public lastDistribution;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _excludedFromTax;
    mapping(address => bool) private _isPair;

    event TaxDistributed(uint256 amount);
    event RewardDistributed(uint256 amount);

    constructor(address taxWallet_) {
        taxWallet = taxWallet_;
        _balances[_msgSender()] = _totalSupply;
        lastDistribution = block.timestamp;
        _excludedFromTax[_msgSender()] = true;
        _excludedFromTax[taxWallet] = true;
    }

    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 approve(
        address spender,
        uint256 amount
    ) public override returns (bool) {
        _allowances[_msgSender()][spender] = amount;
        return true;
    }
    function allowance(
        address owner,
        address spender
    ) public view override returns (uint256) {
        return _allowances[owner][spender];
    }
    function transfer(
        address to,
        uint256 amount
    ) public override returns (bool) {
        _transfer(_msgSender(), to, amount);
        return true;
    }
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        _transfer(from, to, amount);
        return true;
    }

    function _transfer(address from, address to, uint256 amount) internal {
        require(from != address(0), "Invalid sender");
        require(to != address(0), "Invalid receiver");

        uint256 taxAmount = 0;
        if (_isPair[from]) {
            taxAmount = (amount * buyTax) / 100;
        } else if (_isPair[to]) {
            taxAmount = (amount * sellTax) / 100;
        }

        uint256 rewardAmount = taxAmount / 2;
        uint256 taxToWallet = taxAmount - rewardAmount;
        uint256 transferAmount = amount - taxAmount;

        _balances[from] -= amount;
        _balances[to] += transferAmount;
        _balances[taxWallet] += taxToWallet;
        rewardPool += rewardAmount;

        emit TaxDistributed(taxAmount);
    }

    function distributeRewards() public {
        require(
            block.timestamp >= lastDistribution + 10 minutes,
            "Wait 10 min"
        );
        require(rewardPool > 0, "No rewards");

        uint256 totalHolders = 0;
        uint256 totalSupply_ = totalSupply();
        for (uint256 i = 0; i < 100; i++) {
            address holder = address(
                uint160(
                    uint256(keccak256(abi.encodePacked(i, block.timestamp)))
                )
            );
            if (_balances[holder] >= totalSupply_ / 100) {
                totalHolders++;
            }
        }

        require(totalHolders > 0, "No eligible holders");

        uint256 rewardPerHolder = rewardPool / totalHolders;
        for (uint256 i = 0; i < totalHolders; i++) {
            address holder = address(
                uint160(
                    uint256(keccak256(abi.encodePacked(i, block.timestamp)))
                )
            );
            _balances[holder] += rewardPerHolder;
        }

        rewardPool = 0;
        lastDistribution = block.timestamp;
        emit RewardDistributed(rewardPerHolder * totalHolders);
    }

    function setPair(address pair, bool value) public {
        _isPair[pair] = value;
    }
}

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

Context size (optional):