LaunchToken
0xa45d6697067b28f6f64cc755d963648fa31478d1
Verification
Verified
v0.8.28+commit.7893614a
Type
Contract
2,201 bytes
ABI entries
24
9 read · 4 write
License
none
Contract information
- Address
- 0xa45d6697067b28f6f64cc755d963648fa31478d1
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.28+commit.7893614a
- Optimization
- Enabled
- Creator
- 0x7A5f1e159E…5e13967CDc
- Creation tx
- 0x3e5fec0e39…6d3ce81f30
Token
- Name
- Thor's Hammer
- Symbol
- MJOLNIR
- Decimals
- 18
- Holders
- 7
- Market
- View token page →
Read contract (9)
DOMAIN_SEPARATOR() → bytes32
TOTAL_SUPPLY() → uint256
allowance(address, address) → uint256
balanceOf(address) → uint256
decimals() → uint8
name() → string
nonces(address) → uint256
symbol() → string
totalSupply() → uint256
Events (2)
ApprovalTransfer
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AllowanceOverflow",
"type": "error"
},
{
"inputs": [],
"name": "AllowanceUnderflow",
"type": "error"
},
{
"inputs": [],
"name": "InsufficientAllowance",
"type": "error"
},
{
"inputs": [],
"name": "InsufficientBalance",
"type": "error"
},
{
"inputs": [],
"name": "InvalidPermit",
"type": "error"
},
{
"inputs": [],
"name": "Permit2AllowanceIsFixedAtInfinity",
"type": "error"
},
{
"inputs": [],
"name": "PermitExpired",
"type": "error"
},
{
"inputs": [],
"name": "TotalSupplyOverflow",
"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": "amount",
"type": "uint256"
}
],
"name": "Approval",
"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": "Transfer",
"type": "event"
},
{
"inputs": [],
"name": "DOMAIN_SEPARATOR",
"outputs": [
{
"internalType": "bytes32",
"name": "result",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "TOTAL_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": "result",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "result",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "nonces",
"outputs": [
{
"internalType": "uint256",
"name": "result",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "permit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "result",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"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": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.8.28;
import { ERC20 } from "solady/tokens/ERC20.sol";
/// @title LaunchToken
/// @notice ERC20 deployed by LaunchpadFactory for each bonding-curve launch.
/// @dev Anti-rug by design: NO mint (post-deploy), NO burn, NO admin / owner,
/// NO tax / fee logic, NO blocklist, NO pause. Once deployed, the
/// contract has no privileged surface; it behaves as a plain
/// ERC20 + EIP-2612 permit forever.
///
/// Constructor mints the entire `TOTAL_SUPPLY` to the deployer
/// (LaunchpadFactory), which then splits it into the bonding-curve
/// share (BONDING_CURVE_SUPPLY = 793.1M) and the DEX-migration reserve
/// (DEX_RESERVE_SUPPLY = 206.9M) per docs/adr/0001-bonding-curve-constants.md.
contract LaunchToken is ERC20 {
/// @notice Fixed total supply for every launch token: 1 billion units (18 decimals).
/// @dev Matches README Appendix E: TOTAL_SUPPLY = 1_000_000_000e18.
uint256 public constant TOTAL_SUPPLY = 1_000_000_000e18;
string private _name;
string private _symbol;
/// @notice Mint the entire TOTAL_SUPPLY to the deployer (LaunchpadFactory)
/// in one shot. No further minting is possible — `_mint` is
/// private to this contract and there is no admin path that
/// exposes it post-construction.
/// @param name_ ERC-20 name. Set once; immutable in spirit (no setter).
/// @param symbol_ ERC-20 symbol. Set once; immutable in spirit.
constructor(
string memory name_,
string memory symbol_
) {
_name = name_;
_symbol = symbol_;
_mint(msg.sender, TOTAL_SUPPLY);
}
/// @notice ERC-20 name. Returned from a private slot rather than the
/// Solady library's default so creator-supplied names persist.
function name() public view override returns (string memory) {
return _name;
}
/// @notice ERC-20 symbol. Returned from a private slot for the same
/// reason as {name}.
function symbol() public view override returns (string memory) {
return _symbol;
}
// ─── Intentional non-features ───────────────────────────────────────────
//
// - No `decimals()` override: defaults to 18 (Solady).
// - No `mint`, no `burn`, no `pause`, no `setOwner`, no blocklist, no
// transfer fees. By construction.
// - No upgrade path. The contract is final at deploy.
//
// Auditor's note: this is the `LaunchToken` referenced in
// docs/audit/authority.md §1.3 as the immutable, ungoverned ERC-20
// creator-facing guarantee. Any change here breaks that guarantee.
}
Chain explorer2634msChain node83ms