DegenHoodTokenV4
0x04d5d8a61da0b6548b136412843adba55ebeade6
Verification
Verified
v0.8.28+commit.7893614a
Type
Contract
4,256 bytes
ABI entries
29
10 read · 5 write
License
none
Contract information
- Address
- 0x04d5d8a61da0b6548b136412843adba55ebeade6
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.28+commit.7893614a
- Optimization
- Enabled
- Creator
- 0x4999B79be9…B81A0B3a00
- Creation tx
- 0xca8da484c4…4c6618c7c0
Token
- Name
- DegenHood
- Symbol
- DEGEN
- Decimals
- 18
- Holders
- 104
- Market
- View token page →
Read contract (10)
STANDARD_SUPPLY() → uint256
allowance(address, address) → uint256
balanceOf(address) → uint256
contractURI() → string
decimals() → uint8
extraMetadata(string) → string
name() → string
symbol() → string
tokenAdmin() → address
totalSupply() → uint256
Events (4)
ApprovalMetadataUpdatedTokenAdminUpdatedTransfer
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "address",
"name": "supplyRecipient",
"type": "address"
},
{
"internalType": "address",
"name": "tokenAdmin_",
"type": "address"
},
{
"internalType": "string",
"name": "contractURI_",
"type": "string"
},
{
"internalType": "string",
"name": "imageURI_",
"type": "string"
}
],
"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": [],
"name": "InvalidRecipient",
"type": "error"
},
{
"inputs": [],
"name": "InvalidTokenAdmin",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
}
],
"name": "UnauthorizedTokenAdmin",
"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": "string",
"name": "contractURI",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "imageURI",
"type": "string"
}
],
"name": "MetadataUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousAdmin",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "TokenAdminUpdated",
"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"
},
{
"inputs": [],
"name": "STANDARD_SUPPLY",
"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": "contractURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "key",
"type": "string"
}
],
"name": "extraMetadata",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tokenAdmin",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"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": "newAdmin",
"type": "address"
}
],
"name": "transferTokenAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "contractURI_",
"type": "string"
},
{
"internalType": "string",
"name": "imageURI_",
"type": "string"
}
],
"name": "updateMetadata",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/// @title DegenHoodTokenV4
/// @notice Narrow fixed-supply ERC-20 used by every DegenHood v4 factory launch.
/// @dev Adapted from DegenHood's v3 token. Fee, LP, treasury, callback, mint, transfer-tax,
/// allowlist, and wallet-limit capabilities are intentionally absent.
contract DegenHoodTokenV4 is ERC20 {
uint256 public constant STANDARD_SUPPLY = 100_000_000_000 ether;
error InvalidRecipient();
error InvalidTokenAdmin();
error UnauthorizedTokenAdmin(address caller);
event MetadataUpdated(string contractURI, string imageURI);
event TokenAdminUpdated(address indexed previousAdmin, address indexed newAdmin);
address public tokenAdmin;
string private _contractURI;
string private _imageURI;
constructor(
string memory name_,
string memory symbol_,
address supplyRecipient,
address tokenAdmin_,
string memory contractURI_,
string memory imageURI_
) ERC20(name_, symbol_) {
if (supplyRecipient == address(0)) revert InvalidRecipient();
if (tokenAdmin_ == address(0)) revert InvalidTokenAdmin();
tokenAdmin = tokenAdmin_;
_contractURI = contractURI_;
_imageURI = imageURI_;
_mint(supplyRecipient, STANDARD_SUPPLY);
}
function updateMetadata(string calldata contractURI_, string calldata imageURI_) external {
_checkTokenAdmin();
_contractURI = contractURI_;
_imageURI = imageURI_;
emit MetadataUpdated(contractURI_, imageURI_);
}
function transferTokenAdmin(address newAdmin) external {
_checkTokenAdmin();
if (newAdmin == address(0)) revert InvalidTokenAdmin();
address previousAdmin = tokenAdmin;
tokenAdmin = newAdmin;
emit TokenAdminUpdated(previousAdmin, newAdmin);
}
function contractURI() external view returns (string memory) {
return _contractURI;
}
function extraMetadata(string calldata key) external view returns (string memory) {
if (keccak256(bytes(key)) == keccak256("image")) return _imageURI;
return "";
}
function _checkTokenAdmin() private view {
if (msg.sender != tokenAdmin) revert UnauthorizedTokenAdmin(msg.sender);
}
}
Chain explorer4591msChain node89ms