Pre-launch. The protocol is not publicly live yet. This documentation describes the contracts as implemented; deployed addresses are published at launch.

TokenTemplate

The ERC-20 every LP24 token runs. Standard interface plus a minter-only mint/burn and a transfer lock that lifts at graduation.

Contract Type

Minimal proxy (EIP-1167). Initialized once by the factory. 9 decimals. No owner, no blacklist, no pause, no fee-on-transfer.

Transfer States

StateValueTransfers
STATE_UNINITIALIZED0
STATE_LOCKED1Only the minter (the bonding curve) can move tokens
STATE_TRADING2Open to everyone

transferFrom is slightly more permissive while locked: it also allows transfers to the minter, so selling back to the curve works before graduation.

ERC-20 Interface

FunctionNotes
transfer(to, amount) -> boolReverts "Trading not enabled" while locked
transferFrom(from, to, amount) -> boolSame, unless one side is the minter
approve(spender, amount) -> boolAllowed in any state
increaseAllowance(spender, added) -> boolChecked arithmetic — reverts on overflow
decreaseAllowance(spender, subtracted) -> boolReverts "Decreased allowance below zero"
balanceOf(addr) -> uint256Public mapping
allowance(owner, spender) -> uint256Public nested mapping
totalSupply() -> uint256Rises with mints, falls with burns
name() / symbol() / decimals()9 decimals, fixed

Mint and Burn

mint(to: address, amount: uint256) external

Minter only. The minter is the bonding curve, set at initialization and never changeable. Enforces the 1,200,000,000 × 10⁹ (1.2B) hard cap.

Reverts
  • "Only minter"
  • "Mint to zero address"
  • "Exceeds max supply"
burnFrom(from_addr: address, amount: uint256) external

Minter only. Used by the curve on sells and refund claims. Does not consume allowance — the curve verifies the balance itself.

Reverts
  • "Only minter"
  • "Burn from zero address"
  • "Burn exceeds balance"
Who can mint

Only the bonding curve. It mints on buys and, once, the 400,000,000 × 10⁹ (400M) liquidity allocation at graduation. After graduation the curve is closed to trading, so the only remaining supply changes are burns — from secondary-pool fees, buy-and-burn, and dust cleanup. Supply is monotonically non-increasing from graduation onward.

Graduation

enableTrading() external

Minter only. Moves STATE_LOCKEDSTATE_TRADING, permanently. Called inside graduation.

Reverts
  • "Only minter", "Invalid state"
Emits

TradingEnabled(timestamp)

Initialization

initialize(_name, _symbol, _minter, _deployer, _mint_to) external

Factory only. Mints 60,000,000 × 10⁹ (60M) to _mint_to — the deployer on the user path, the vesting contract on the protocol path. _deployer is stored separately for authorization.

Reverts
  • "Already initialized"
  • "Invalid minter" / "Invalid deployer" / "Invalid mint recipient"
  • "Unauthorized"

Views

FunctionReturns
tradingEnabled() -> boolWhether transfers are open
minter() -> addressThe bonding curve
deployer() -> addressOriginal deployer at launch. Not updated by CTO — the authoritative current deployer is PrimaryHook.tokenInfo(token).deployer.

Constants

ConstantValue
decimals9
INITIAL_MINT_AMOUNT60,000,000 × 10⁹ (60M)
MAX_SUPPLY1,200,000,000 × 10⁹ (1.2B)