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

Error Messages

Every revert string in the protocol, grouped by contract, with the condition that produces it. All are plain assert strings — there are no custom errors to decode.

Factory

MessageCause
Protocol token not yet deployeddeploy_pair before the one-shot protocol deploy has run
Not system deployerdeploy_protocol_token from any other address
Protocol already deployedSecond call to deploy_protocol_token
Incorrect feemsg.value is not exactly deployment_fee
Invalid name/symbolEither string is empty
Invalid saltAnchor block field is zero
Anchor not minedAnchor is the current block or later
Too latePast anchor_block + INCLUSION_WINDOW
Blockhash unavailableAnchor more than 256 blocks back
Blockhash mismatchSalt bytes [8:16] do not match the anchor's hash prefix
Vanity missResulting address does not begin 0x24 — usually mining against the raw salt instead of keccak256(salt ‖ msg.sender)
Only hookmoveDeployerToken from anything but the hook
Index OOBgetDeployerTokenAt past the end

BondingCurveTemplate

MessageCause
Already initializedSecond initialize
Unauthorizedinitialize from anything but the factory
Invalid token / Invalid deployerZero address passed
Protocol path sends no feeis_protocol=True with non-zero value
Incorrect feeUser path value is not DEPLOYER_INITIAL_PAYMENT
Below minimumFewer than 1 lot
Not initializedFLAG_INITIALIZED unset
Invalid stateAlready graduated or in refund mode
Supply exceededBuy would push past 800,000 lots
User limit exceededPost-trade balance above 36,000 lots
Incorrect paymentmsg.value does not match the quote — re-quote and retry
Insufficient native for graduationCurve balance below FIXED_LIQUIDITY_NATIVE at graduation
Deployer lockedDeployer attempted to sell
Insufficient tokensBalance below the requested lots
Cannot sell at floorSupply is at 60,000 lots
Insufficient contract balanceCurve cannot cover the sell proceeds
Protocol curve cannot refundinitiate_refund on $LP24's curve
Period not overLess than 259,200 s (3 days) since deployment
No refundsZero balance or no eligible lots
Not refund modeClaiming or sweeping outside refund mode
Refund window closedPast the 604,800 s (7 days) deadline
Deployer cannot refundDeployer attempted to claim
Insufficient balanceCurve cannot cover the refund
Refund window still openSweeping before the deadline
Already sweptTerminal state already reached

TokenTemplate

MessageCause
Trading not enabledTransfer while locked, and neither side is the minter
Transfer to zero addressZero recipient
Insufficient balance / Insufficient allowanceStandard ERC-20
Approve to zero addressZero spender
Decreased allowance below zerodecreaseAllowance underflow
Only mintermint, burnFrom or enableTrading from a non-minter
Exceeds max supplyMint past 1,200,000,000 × 10⁹ (1.2B)
Burn exceeds balanceBurn more than held
Already initialized / UnauthorizedRe-init, or init from a non-factory
Invalid minter / Invalid deployer / Invalid mint recipientZero address in initialize

PrimaryHook & GraduationManager

MessageCause
Only a factory curve may graduateFactory.is_curve(msg.sender) is false
Already registeredToken has already graduated
Invalid deployerZero deployer at graduation
Insufficient graduation fundsmsg.value < GRADUATION_NATIVE
Secondary native push failedThe SecondaryHook rejected the earmark push
Pool sqrtPrice mismatchGnosis — the V3 pool was re-initialized at a different price
Pool init not permittedbeforeInitialize without the transient gate set — a front-run attempt
UnauthorizedA hook callback invoked by anything but the pool manager
Exact-output buys disabledBuy swap with amountSpecified > 0
Use processProtocolFeesdistributeFees called on $LP24
No positionToken has not graduated
No fees / Nothing to distributePending balance at or below dust
Nothing to processProtocol balance at or below 1,000,000 wei
No protocol token$LP24 constant unset
Pool not initialized$LP24 pool has no price
Pool too thin for any safe swapThe MEV cap leaves no room for any swap — wait for liquidity
No deployer fees for protocol tokenWithdrawal attempted on $LP24
Not deployerCaller is not the current registered deployer
CTO not enabledVote template not configured
Protocol token cannot be CTO'dTakeover attempted on $LP24
Send exact CTO feeFee is not exact — no overage refund
Token not registeredToken has not graduated
CTO vote already activeClear the previous one with cancel_failed_cto
Stake transfer failedInsufficient allowance or balance for the stake
No active vote / Not vote contractFinalization from the wrong caller
Invalid new deployerZero address would lock fees permanently
Vote still active / Vote was finalized / Vote passed - must finalizecancel_failed_cto preconditions

SecondaryHook

MessageCause
Only PRIMARY_HOOKnotifyReserved from any other address
Wrong native amountEarmark value is not exactly SECONDARY_NATIVE_RAW
No secondary for PROTOCOL_TOKEN$LP24 cannot pair with itself
Token not registered in PrimaryHookToken has not graduated
Secondary existsPool already created
Token funds not receivedContract holds less than 40,000,000 × 10⁹ (40M)
No native earmark for tokenNever funded by the PrimaryHook, or already consumed. Sending tokens yourself does not create an earmark.
Exact-output disabledExact-output swap on a secondary pool
amount0 zeroDegenerate initial price calculation

CTOVoteTemplate

MessageCause
Already initialized / Only hookRe-init, or init from a non-hook
Invalid token / Invalid hook / Invalid initiatorZero address
Initiator needs 5% of supplyStake below 60,000,000 × 10⁹ (60M, 5% of supply)
Not initializedActing on an uninitialized vote
Voting ended / Vote period expiredVoting after close
Amount must be > 0Zero-value vote
Already votedUse add_votes instead
Must vote firstadd_votes with no existing position
Transfer failedInsufficient allowance or balance
Already ended / Vote still activeend_vote timing
Too early to end earlyLess than 3,600 s (1 hour) since opening
Quorum not met / Majority not achievedend_vote_early preconditions unmet
Vote not ended / Already finalized / Vote did not passFinalization preconditions
Withdraw next blockFlash-loan guard — withdrawal is locked to a block after close
No tokens to withdrawNothing deposited, or already withdrawn

TokenSocials & TokenVesting

MessageCause
Not ownerset_socials or transfer_owner from a non-owner
Not registeredToken has no socials record
Unauthorizedregister_token from anything but the factory
nothing to releaseStill within the cliff, or everything vested so far is already released
token cannot be zero / beneficiary cannot be zeroVesting constructor validation
Two reverts worth recognising

Incorrect payment on a buy almost always means someone else's buy landed first and moved the price — re-quote and resubmit, it is not a bug. Pool too thin for any safe swap means the MEV cap has left no headroom on a nearly-empty pool; it resolves as liquidity returns and is not a permanent failure.