// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/// @title HoodlToken
/// @notice The ERC-20 minted for every Hoodl launch. Deliberately plain: fixed 1B supply, 18 decimals,
/// **no transfer tax / no hooks / no owner / no mint after construction** (the fee model lives
/// entirely in the Uniswap V3 pool + FeeManager, not in the token — so aggregator routing never
/// breaks; see brief §2). The full supply is minted once, to `mintTo` (the LaunchFactory), which
/// seeds the locked single-sided V3 position and any optional dev-buy.
/// @dev Built on **OpenZeppelin ERC20** (not Solady) on purpose: it's the plain, standard base the other
/// V3 launchpads deploy (Clanker, NOXA's FunToken), and — unlike Solady's ERC20, which by default
/// hardcodes the canonical Permit2 address with an infinite allowance — it grants **no privileged
/// spender**. Static bytecode scanners (serializedaudit, gmgn/explorer heuristics) read Solady's
/// hardcoded Permit2 max-allowance as a "hidden-owner / UnauthorizedTransfer backdoor" and flag the
/// token "Unsafe"; a plain OZ ERC20 has nothing of that shape, so it scans clean like every other
/// launchpad's token. Permit2 (our swap router) still works — it just needs a normal one-time
/// `approve(Permit2)` before a wallet's first sell, which the swap layer already issues.
contract HoodlToken is ERC20 {
/// @notice Fixed total supply for every Hoodl token: 1,000,000,000 * 1e18.
uint256 public constant TOTAL_SUPPLY = 1_000_000_000 ether;
/// @notice The address that launched this token (informational; not a privileged role).
address public immutable launcher;
constructor(string memory name_, string memory symbol_, address mintTo, address launcher_)
ERC20(name_, symbol_)
{
require(mintTo != address(0), "HOODL: mintTo=0");
launcher = launcher_;
_mint(mintTo, TOTAL_SUPPLY);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "mintTo",
"type": "address",
"internalType": "address"
},
{
"name": "launcher_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TOTAL_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "launcher",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c8063313ce5671161006e578063313ce5671461014f57806370a082311461015e578063902d55a51461018657806395d89b4114610199578063a9059cbb146101a1578063dd62ed3e146101b4575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806316eebd1e146100eb57806318160ddd1461012a57806323b872dd1461013c575b5f5ffd5b6100b26101ec565b6040516100bf91906105bb565b60405180910390f35b6100db6100d636600461060b565b61027c565b60405190151581526020016100bf565b6101127f0000000000000000000000002511db3e04f82bb48b99cd8c49057eb8a010de0581565b6040516001600160a01b0390911681526020016100bf565b6002545b6040519081526020016100bf565b6100db61014a366004610633565b610295565b604051601281526020016100bf565b61012e61016c36600461066d565b6001600160a01b03165f9081526020819052604090205490565b61012e6b033b2e3c9fd0803ce800000081565b6100b26102b8565b6100db6101af36600461060b565b6102c7565b61012e6101c236600461068d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101fb906106be565b80601f0160208091040260200160405190810160405280929190818152602001828054610227906106be565b80156102725780601f1061024957610100808354040283529160200191610272565b820191905f5260205f20905b81548152906001019060200180831161025557829003601f168201915b5050505050905090565b5f336102898185856102d4565b60019150505b92915050565b5f336102a28582856102e6565b6102ad858585610366565b506001949350505050565b6060600480546101fb906106be565b5f33610289818585610366565b6102e183838360016103c3565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610360578181101561035257604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b61036084848484035f6103c3565b50505050565b6001600160a01b03831661038f57604051634b637e8f60e11b81525f6004820152602401610349565b6001600160a01b0382166103b85760405163ec442f0560e01b81525f6004820152602401610349565b6102e1838383610495565b6001600160a01b0384166103ec5760405163e602df0560e01b81525f6004820152602401610349565b6001600160a01b03831661041557604051634a1406b160e11b81525f6004820152602401610349565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561036057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161048791815260200190565b60405180910390a350505050565b6001600160a01b0383166104bf578060025f8282546104b491906106f6565b9091555061052f9050565b6001600160a01b0383165f90815260208190526040902054818110156105115760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610349565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661054b57600280548290039055610569565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516105ae91815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610606575f5ffd5b919050565b5f5f6040838503121561061c575f5ffd5b610625836105f0565b946020939093013593505050565b5f5f5f60608486031215610645575f5ffd5b61064e846105f0565b925061065c602085016105f0565b929592945050506040919091013590565b5f6020828403121561067d575f5ffd5b610686826105f0565b9392505050565b5f5f6040838503121561069e575f5ffd5b6106a7836105f0565b91506106b5602084016105f0565b90509250929050565b600181811c908216806106d257607f821691505b6020821081036106f057634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561028f57634e487b7160e01b5f52601160045260245ffdfea264697066735822122040e3c28593e7a15265856ff8c5deb9a455fa4cbf00a9409b59f0cf5017006f9f64736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x58b963…1697e0 | 24 days agoFri, 24 Jul 2026 14:23:56 UTC | Transfer | [0] 0x000000000000…9c9b5c42 [1] 0x000000000000…96617387 data: 0x000000000000000000…118f4ac0 |
| 0xfc1174…30328b | 24 days agoFri, 24 Jul 2026 14:23:44 UTC | Approval | [0] 0x000000000000…9c9b5c42 [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0x98eb4a…14f36b | 24 days agoFri, 24 Jul 2026 14:11:52 UTC | Transfer | [0] 0x000000000000…a010de05 [1] 0x000000000000…96617387 data: 0x000000000000000000…2696c4f9 |
| 0x2a66dd…c9ac1d | 24 days agoFri, 24 Jul 2026 14:11:42 UTC | Approval | [0] 0x000000000000…a010de05 [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0xbc0dd9…985b40 | 25 days agoThu, 23 Jul 2026 20:35:51 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…9c9b5c42 data: 0x000000000000000000…370c1e03 |
| 0xbc0dd9…985b40 | 25 days agoThu, 23 Jul 2026 20:35:51 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…76e954e6 data: 0x000000000000000000…76a0dd6a |
| 0xbc0dd9…985b40 | 25 days agoThu, 23 Jul 2026 20:35:51 UTC | Transfer | [0] 0x000000000000…96617387 [1] 0x000000000000…db8c0904 data: 0x000000000000000000…adacfb6d |
| 0x19b233…91ebad | 25 days agoThu, 23 Jul 2026 20:35:43 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…9c9b5c42 data: 0x000000000000000000…da832cbd |
| 0x19b233…91ebad | 25 days agoThu, 23 Jul 2026 20:35:43 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…76e954e6 data: 0x000000000000000000…4a6cb82f |
| 0x19b233…91ebad | 25 days agoThu, 23 Jul 2026 20:35:43 UTC | Transfer | [0] 0x000000000000…96617387 [1] 0x000000000000…db8c0904 data: 0x000000000000000000…24efe4ec |
| 0x0aafb4…2e59c4 | 25 days agoThu, 23 Jul 2026 20:33:51 UTC | Transfer | [0] 0x000000000000…8f6b925b [1] 0x000000000000…96617387 data: 0x000000000000000000…d264ac46 |
| 0x7df427…ac04f9 | 25 days agoThu, 23 Jul 2026 20:33:51 UTC | Approval | [0] 0x000000000000…8f6b925b [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xe4dbed…a914a8 | 25 days agoThu, 23 Jul 2026 20:33:34 UTC | Transfer | [0] 0x000000000000…96617387 [1] 0x000000000000…8f6b925b data: 0x000000000000000000…d264ac46 |
| 0x694254…de9e4f | 25 days agoThu, 23 Jul 2026 20:33:30 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…a010de05 data: 0x000000000000000000…6805153d |
| 0x694254…de9e4f | 25 days agoThu, 23 Jul 2026 20:33:30 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…76e954e6 data: 0x000000000000000000…e2ef4d4a |
| 0x694254…de9e4f | 25 days agoThu, 23 Jul 2026 20:33:30 UTC | Transfer | [0] 0x000000000000…96617387 [1] 0x000000000000…db8c0904 data: 0x000000000000000000…4af46287 |
| 0x5b413c…7b9e75 | 25 days agoThu, 23 Jul 2026 20:33:01 UTC | Transfer | [0] 0x000000000000…96617387 [1] 0x000000000000…a010de05 data: 0x000000000000000000…be91afbc |
| 0x5b413c…7b9e75 | 25 days agoThu, 23 Jul 2026 20:33:01 UTC | Transfer | [0] 0x000000000000…64a8d055 [1] 0x000000000000…96617387 data: 0x000000000000000000…e7ffd018 |
| 0x5b413c…7b9e75 | 25 days agoThu, 23 Jul 2026 20:33:01 UTC | Approval | [0] 0x000000000000…64a8d055 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0x5b413c…7b9e75 | 25 days agoThu, 23 Jul 2026 20:33:01 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…64a8d055 data: 0x000000000000000000…e8000000 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xfc1174…30328b | Approve | 18,217,731 | 24 days agoFri, 24 Jul 2026 14:23:44 UTC | 0x860e…5c42 | IN | Plink Cat | $0.000 ETH | 0.00000530 | |
| 0x2a66dd…c9ac1d | Approve | 18,210,517 | 24 days agoFri, 24 Jul 2026 14:11:42 UTC | 0x2511…de05 | IN | Plink Cat | $0.000 ETH | 0.00000518 | |
| 0x7df427…ac04f9 | Approve | 17,578,128 | 25 days agoThu, 23 Jul 2026 20:33:51 UTC | 0xfa3f…925b | IN | Plink Cat | $0.000 ETH | 0.00000572 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 17,577,638 | 25 days agoThu, 23 Jul 2026 20:33:01 UTC | 0x5b413c…7b9e75 | CREATE2 | createToken | 0x303d…d055 | IN | 0x5013…f786 | 0 ETH |