all files / contracts/ DAOToken.sol

69.57% Statements 16/23
34.62% Branches 9/26
77.78% Functions 7/9
71.88% Lines 23/32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140                                                                                                                27×                     14× 14× 14× 14× 14×     14× 14×     14× 14×     14× 14×       14× 14× 14× 14×                                                         184×                     184×        
// SPDX-License-Identifier: MIT
//   _____          ____       _______ ____  _  ________ _   _ 
//  |  __ \   /\   / __ \     |__   __/ __ \| |/ /  ____| \ | |
//  | |  | | /  \ | |  | |       | | | |  | | ' /| |__  |  \| |
//  | |  | |/ /\ \| |  | |       | | | |  | |  < |  __| | . ` |
//  | |__| / ____ \ |__| |       | | | |__| | . \| |____| |\  |
//  |_____/_/    \_\____/        |_|  \____/|_|\_\______|_| \_| 
//                                                                                         
//                                                                                         
// Deployed by createDAO.org - DAO Token Implementation
// GitHub: https://github.com/createdao
// 
// 🌍 This code is free. Like speech. Like people should be.
// Use it, learn from it, build with it. Share what you make.
// But remember what this is for: not greed, not ego — but freedom, creativity, and unity.
// 
// Inspired by Chaplin's call in The Great Dictator:
// “You, the people, have the power — the power to create happiness!”
// 
// So build not for domination, but for decentralization.
// Not for walls, but bridges. Not for power, but empowerment.
// 
// Licensed under the MIT License — short, sweet, and to the point.
// No restrictions, no delays. Just create. Just be human. ✌️
// — Diornov
 
 
 
 
pragma solidity ^0.8.20;
 
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
 
contract DAOToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
    // Constants
    string private constant VERSION = "1.0.0";
    uint16 private constant MAX_TAX = 1000; // 10% in basis points
    
    // State variables
    address public stakingContract;
    address public taxRecipient;
    uint16 public taxRate; // In basis points (1 = 0.01%)
    mapping(address => bool) public isWhitelisted;
    
    // Events
    event StakingContractSet(address indexed stakingContract);
    event TaxRateUpdated(uint16 newRate);
    event TaxRecipientUpdated(address indexed newRecipient);
    event WhitelistUpdated(address[] accounts, bool status);
    
    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() {
        _disableInitializers();
    }
 
    function initialize(
        string memory name,
        string memory symbol,
        uint256 initialSupply,
        address initialHolder,
        address treasury,
        address owner
    ) external Einitializer {
        __ERC20_init(name, symbol);
        __Ownable_init(owner);
        __UUPSUpgradeable_init();
        Erequire(initialHolder != address(0), "Zero holder");
        Erequire(treasury != address(0), "Zero treasury");
        
        // Mint initial supply
        _mint(initialHolder, 1e18); // 1 token for initial holder
        _mint(treasury, initialSupply - 1e18); // Rest to treasury
        
        // Initialize tax settings
        taxRate = 0; // 1% default tax
        taxRecipient = treasury;
        
        // Whitelist important addresses
        isWhitelisted[treasury] = true;
        isWhitelisted[initialHolder] = true;
    }
    
    function setStakingContract(address _stakingContract) external EonlyOwner {
        Erequire(_stakingContract != address(0), "Zero staking");
        stakingContract = _stakingContract;
        isWhitelisted[_stakingContract] = true;
        emit StakingContractSet(_stakingContract);
    }
    
    function setTaxRate(uint16 newRate) external onlyOwner {
        require(newRate <= MAX_TAX, "Rate > 10%");
        taxRate = newRate;
        emit TaxRateUpdated(newRate);
    }
    
    function setTaxRecipient(address newRecipient) external onlyOwner {
        require(newRecipient != address(0), "Zero recipient");
        taxRecipient = newRecipient;
        emit TaxRecipientUpdated(newRecipient);
    }
    
    function updateWhitelist(address[] calldata accounts, bool status) external EonlyOwner {
        for(uint i = 0; i < accounts.length; i++) {
            Erequire(accounts[i] != address(0), "Zero address");
            isWhitelisted[accounts[i]] = status;
        }
        emit WhitelistUpdated(accounts, status);
    }
    
    function _authorizeUpgrade(address newImplementation) internal override EonlyOwner {}
 
    function version() external pure virtual returns (string memory) {
        return VERSION;
    }
 
    function _update(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        Iif (
            taxRate > 0 && // Tax is enabled
            !isWhitelisted[from] && // Sender not whitelisted
            !isWhitelisted[to] && // Recipient not whitelisted
            from != address(0) && // Not minting
            to != address(0) // Not burning
        ) {
            uint256 taxAmount = (amount * taxRate) / 10000;
            super._update(from, taxRecipient, taxAmount);
            super._update(from, to, amount - taxAmount);
        } else {
            super._update(from, to, amount);
        }
    }
}