TaxToken
0x6f389a19569f8477d51db820226582927d7d6319
Verification
Verified
v0.8.20+commit.a1b79de6
Type
Contract
6,153 bytes
ABI entries
34
11 read · 8 write
License
none
Contract information
- Address
- 0x6f389a19569f8477d51db820226582927d7d6319
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.20+commit.a1b79de6
- Optimization
- Disabled
- Creator
- 0x46606774FB…1D178481ee
- Creation tx
- 0xf44c330546…a9167a1fe0
Token
- Name
- HOODSHIBA
- Symbol
- HOODSHIB
- Decimals
- 18
- Holders
- 27
- Market
- View token page →
Read contract (11)
MAX_TAX_BASIS_POINTS() → uint256
allowance(address, address) → uint256
balanceOf(address) → uint256
decimals() → uint8
isExcludedFromTax(address) → bool
name() → string
owner() → address
symbol() → string
taxBasisPoints() → uint256
totalSupply() → uint256
treasury() → address
Events (6)
ApprovalExcludedFromTaxOwnershipTransferredTaxUpdatedTransferTreasuryUpdated
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "uint256",
"name": "initialSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "initialTaxBasisPoints",
"type": "uint256"
},
{
"internalType": "address",
"name": "treasury_",
"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"
},
{
"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": "address",
"name": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "excluded",
"type": "bool"
}
],
"name": "ExcludedFromTax",
"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": false,
"internalType": "uint256",
"name": "newTaxBasisPoints",
"type": "uint256"
}
],
"name": "TaxUpdated",
"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": false,
"internalType": "address",
"name": "newTreasury",
"type": "address"
}
],
"name": "TreasuryUpdated",
"type": "event"
},
{
"inputs": [],
"name": "MAX_TAX_BASIS_POINTS",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"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": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isExcludedFromTax",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"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": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "excluded",
"type": "bool"
}
],
"name": "setExcludedFromTax",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newTaxBasisPoints",
"type": "uint256"
}
],
"name": "setTax",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newTreasury",
"type": "address"
}
],
"name": "setTreasury",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "taxBasisPoints",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"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": "treasury",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"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";
/// @title TaxToken
/// @notice ERC20 token with a configurable transfer tax that is sent to a treasury wallet.
/// Works on any EVM chain (Ethereum, Robinhood Chain, etc.) unmodified.
contract TaxToken is ERC20, Ownable {
// Tax expressed in basis points (1% = 100, max 10% = 1000)
uint256 public taxBasisPoints;
uint256 public constant MAX_TAX_BASIS_POINTS = 1000; // hard cap: 10%
address public treasury;
// Addresses excluded from tax (e.g. owner, treasury, LP contract)
mapping(address => bool) public isExcludedFromTax;
event TaxUpdated(uint256 newTaxBasisPoints);
event TreasuryUpdated(address newTreasury);
event ExcludedFromTax(address account, bool excluded);
constructor(
string memory name_,
string memory symbol_,
uint256 initialSupply,
uint256 initialTaxBasisPoints,
address treasury_
) ERC20(name_, symbol_) Ownable(msg.sender) {
require(treasury_ != address(0), "treasury cannot be zero address");
require(initialTaxBasisPoints <= MAX_TAX_BASIS_POINTS, "tax too high");
treasury = treasury_;
taxBasisPoints = initialTaxBasisPoints;
isExcludedFromTax[msg.sender] = true;
isExcludedFromTax[treasury_] = true;
isExcludedFromTax[address(this)] = true;
_mint(msg.sender, initialSupply * 10 ** decimals());
}
/// @notice Owner can adjust the tax rate, capped at MAX_TAX_BASIS_POINTS.
function setTax(uint256 newTaxBasisPoints) external onlyOwner {
require(newTaxBasisPoints <= MAX_TAX_BASIS_POINTS, "tax too high");
taxBasisPoints = newTaxBasisPoints;
emit TaxUpdated(newTaxBasisPoints);
}
/// @notice Owner can update the treasury address that receives tax.
function setTreasury(address newTreasury) external onlyOwner {
require(newTreasury != address(0), "treasury cannot be zero address");
treasury = newTreasury;
emit TreasuryUpdated(newTreasury);
}
/// @notice Owner can exclude/include an address from paying tax.
function setExcludedFromTax(address account, bool excluded) external onlyOwner {
isExcludedFromTax[account] = excluded;
emit ExcludedFromTax(account, excluded);
}
/// @dev Overrides the internal transfer function to apply tax.
function _update(address from, address to, uint256 value) internal override {
// Minting and burning bypass tax
if (from == address(0) || to == address(0) || taxBasisPoints == 0
|| isExcludedFromTax[from] || isExcludedFromTax[to]) {
super._update(from, to, value);
return;
}
uint256 taxAmount = (value * taxBasisPoints) / 10000;
uint256 sendAmount = value - taxAmount;
super._update(from, treasury, taxAmount);
super._update(from, to, sendAmount);
}
}
Chain explorer6282msChain node143ms