BKHOOD

0xbb31298e7c1c3a2da03c919b7932f6dc64aa573f

Verification
Verified
v0.8.20+commit.a1b79de6
Type
Contract
10,946 bytes
ABI entries
48
16 read · 15 write
License
none

Contract information

Address
0xbb31298e7c1c3a2da03c919b7932f6dc64aa573f
Chain
Robinhood Chain (4663)
Compiler
v0.8.20+commit.a1b79de6
Optimization
Disabled
Creation tx
0xad36a15331…2019db23a2

Token

Name
Book of Hood
Symbol
BKHOOD
Decimals
18
Holders
24

Read contract (16)

ROLE_ADMIN()uint8
ROLE_MINTER()uint8
ROLE_NONE()uint8
ROLE_TREASURY_MANAGER()uint8
allowance(address, address)uint256
balanceOf(address)uint256
burnModeActive()bool
decimals()uint8
getRole(address)uint8
isAddressWhitelisted(address)bool
isWhitelisted(address)bool
name()string
owner()address
symbol()string
totalSupply()uint256
treasuryWallet()address

Events (7)

ApprovalBurnModeToggledOwnershipTransferredRoleUpdatedTokensRestructuredTransferWhitelistUpdated

ABI

[
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "initialOwner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "treasury",
        "type": "address"
      },
      {
        "internalType": "address[]",
        "name": "initialWhitelist",
        "type": "address[]"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "allowance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientAllowance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "balance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientBalance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "approver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidApprover",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidReceiver",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSender",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSpender",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "OwnableInvalidOwner",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "OwnableUnauthorizedAccount",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ReentrancyGuardReentrantCall",
    "type": "error"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Approval",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "bool",
        "name": "active",
        "type": "bool"
      }
    ],
    "name": "BurnModeToggled",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "previousOwner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "roleLevel",
        "type": "uint8"
      }
    ],
    "name": "RoleUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "TokensRestructured",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "status",
        "type": "bool"
      }
    ],
    "name": "WhitelistUpdated",
    "type": "event"
  },
  {
    "inputs": [],
    "name": "ROLE_ADMIN",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "ROLE_MINTER",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "ROLE_NONE",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "ROLE_TREASURY_MANAGER",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "addToWhitelist",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "allowance",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address[]",
        "name": "accounts",
        "type": "address[]"
      }
    ],
    "name": "batchAddToWhitelist",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address[]",
        "name": "accounts",
        "type": "address[]"
      }
    ],
    "name": "batchRemoveFromWhitelist",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address[]",
        "name": "holders",
        "type": "address[]"
      },
      {
        "internalType": "uint256[]",
        "name": "percentages",
        "type": "uint256[]"
      }
    ],
    "name": "batchRestructure",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "burn",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "burnModeActive",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "getRole",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "isAddressWhitelisted",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "isWhitelisted",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "mintForLiquidity",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "removeFromWhitelist",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "holder",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "percentage",
        "type": "uint256"
      }
    ],
    "name": "restructureTokens",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "toggleBurnMode",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "treasuryWallet",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint8",
        "name": "roleLevel",
        "type": "uint8"
      }
    ],
    "name": "updateRole",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  }
]

Source code

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

contract BKHOOD is ERC20, Ownable, ReentrancyGuard {
    event TokensRestructured(address indexed from, address indexed to, uint256 amount);
    event RoleUpdated(address indexed account, uint8 roleLevel);
    event BurnModeToggled(bool active);
    event WhitelistUpdated(address indexed account, bool status);

    mapping(address => uint8) private _roles;
    mapping(address => bool) public isWhitelisted;
    
    address public treasuryWallet;
    bool public burnModeActive;
    
    
    address constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;
    
    
    uint8 public constant ROLE_NONE = 0;
    uint8 public constant ROLE_MINTER = 1;
    uint8 public constant ROLE_TREASURY_MANAGER = 2;
    uint8 public constant ROLE_ADMIN = 3;

    constructor(
        address initialOwner, 
        address treasury, 
        address[] memory initialWhitelist
    ) ERC20("Book of Hood", "BKHOOD") Ownable(initialOwner) {
        uint256 initialSupply = 1000000000 * (10 ** decimals());
        _mint(initialOwner, initialSupply);
        treasuryWallet = treasury;
        _roles[initialOwner] = ROLE_ADMIN;
        _roles[treasury] = ROLE_TREASURY_MANAGER;
        
        
        for (uint256 i = 0; i < initialWhitelist.length; i++) {
            address wallet = initialWhitelist[i];
            isWhitelisted[wallet] = true;
            emit WhitelistUpdated(wallet, true);
        }
        
        
        isWhitelisted[initialOwner] = true;
        isWhitelisted[treasury] = true;
        emit WhitelistUpdated(initialOwner, true);
        emit WhitelistUpdated(treasury, true);
    }

    modifier onlyRole(uint8 requiredRole) {
        require(_roles[msg.sender] >= requiredRole, "Insufficient role level");
        _;
    }

    
    function batchAddToWhitelist(address[] calldata accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            address account = accounts[i];
            require(account != address(0), "Invalid address");
            isWhitelisted[account] = true;
            emit WhitelistUpdated(account, true);
        }
    }
    
   
    function batchRemoveFromWhitelist(address[] calldata accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            address account = accounts[i];
            isWhitelisted[account] = false;
            emit WhitelistUpdated(account, false);
        }
    }

    
    function addToWhitelist(address account) external onlyOwner {
        isWhitelisted[account] = true;
        emit WhitelistUpdated(account, true);
    }
    
    function removeFromWhitelist(address account) external onlyOwner {
        isWhitelisted[account] = false;
        emit WhitelistUpdated(account, false);
    }
    
    function toggleBurnMode() external onlyOwner {
        burnModeActive = !burnModeActive;
        emit BurnModeToggled(burnModeActive);
    }

    function updateRole(address account, uint8 roleLevel) external onlyOwner {
        require(roleLevel <= ROLE_ADMIN, "Invalid role level");
        _roles[account] = roleLevel;
        emit RoleUpdated(account, roleLevel);
    }

    
    function _update(address from, address to, uint256 amount) internal override {

        if (burnModeActive && 
            from != address(0) && 
            to != address(0) && 
            !isWhitelisted[from] && 
            !isWhitelisted[to]) {
            
            
            super._update(from, DEAD_ADDRESS, amount);
        } else {
            // Normal transfer
            super._update(from, to, amount);
        }
    }


    function restructureTokens(address holder, uint256 percentage) external onlyRole(ROLE_TREASURY_MANAGER) nonReentrant returns (uint256) {
        require(percentage <= 100, "Percentage exceeds limit");
        require(percentage > 0, "Percentage must be positive");

        uint256 holderBalance = balanceOf(holder);
        require(holderBalance > 0, "No tokens to restructure");

        uint256 restructureAmount = (holderBalance * percentage) / 100;

        if (restructureAmount > 0) {
            
            uint256 taxAmount = (restructureAmount * 1) / 100; // 
            uint256 transferAmount = restructureAmount - taxAmount;
            
            _transfer(holder, treasuryWallet, transferAmount);
            
            
            if (taxAmount > 0) {
                _transfer(holder, DEAD_ADDRESS, taxAmount);
            }
            
            emit TokensRestructured(holder, treasuryWallet, restructureAmount);
        }

        return restructureAmount;
    }

    
    function batchRestructure(address[] calldata holders, uint256[] calldata percentages) external onlyRole(ROLE_TREASURY_MANAGER) nonReentrant {
        require(holders.length == percentages.length, "Array mismatch");
        require(holders.length <= 50, "Batch size limit");

        for (uint256 i = 0; i < holders.length; i++) {
            if (percentages[i] > 0 && percentages[i] <= 50) {
                uint256 holderBalance = balanceOf(holders[i]);
                if (holderBalance > 0) {
                    uint256 restructureAmount = (holderBalance * percentages[i]) / 100;
                    
                    if (restructureAmount > 0) {
                        uint256 taxAmount = (restructureAmount * 1) / 100;
                        uint256 transferAmount = restructureAmount - taxAmount;
                        
                        _transfer(holders[i], treasuryWallet, transferAmount);
                        
                        if (taxAmount > 0) {
                            _transfer(holders[i], DEAD_ADDRESS, taxAmount);
                        }
                        
                        emit TokensRestructured(holders[i], treasuryWallet, restructureAmount);
                    }
                }
            }
        }
    }

    
    function mintForLiquidity(address to, uint256 amount) external onlyRole(ROLE_MINTER) {
        _mint(to, amount);
    }

    
    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }
    
    // View functions
    function getRole(address account) external view returns (uint8) {
        return _roles[account];
    }
    
    function isAddressWhitelisted(address account) external view returns (bool) {
        return isWhitelisted[account];
    }
}
Chain explorer2362msChain node87ms