LaunchToken

0xb7cb112d0d14e4c0e8407a06d8bfef5eef72efb7

Verification
Verified
v0.8.28+commit.7893614a
Type
Contract
2,201 bytes
ABI entries
24
9 read · 4 write
License
none

Contract information

Address
0xb7cb112d0d14e4c0e8407a06d8bfef5eef72efb7
Chain
Robinhood Chain (4663)
Compiler
v0.8.28+commit.7893614a
Optimization
Enabled
Creation tx
0x66028a8c9b…9ac3a4b3ae

Token

Name
Monk in Hood
Symbol
MOOD
Decimals
18
Holders
4

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 explorer4341msChain node80ms