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

Factory

The entry point. Deploys the protocol pair once, then user token + bonding curve pairs with vanity enforcement. Also owns the deployer-token registry and the curve registry that the hooks trust.

Contract Type

Singleton — one per chain. No owner. The only privileged address is system_deployer, which can call deploy_protocol_token exactly once and has no other power.

Deployment Functions

deploy_pair(name: String[64], symbol: String[32], salt: bytes32, packed_socials: bytes32 = empty(bytes32)) -> (address, address) external payable

Deploy a token + bonding curve pair. Returns (token, curve). Anyone can call once the protocol token exists.

Value

Must equal the chain's deployment_fee exactly — Base 0.06 ETH, BSC 0.18 BNB, Polygon 1,440 POL, Robinhood 0.06 ETH, Gnosis 144 xDAI. Forwarded in full to the bonding curve.

Reverts
  • "Protocol token not yet deployed"deploy_protocol_token has not run
  • "Incorrect fee"msg.value != deployment_fee
  • "Invalid name/symbol" — either is empty
  • "Invalid salt" — anchor block is zero
  • "Anchor not mined"block.number <= anchor_block
  • "Too late" — past the inclusion window
  • "Blockhash unavailable" — anchor more than 256 blocks back
  • "Blockhash mismatch" — salt's committed prefix does not match
  • "Vanity miss" — resulting address does not start 0x24
Emits

PairDeployed(token, curve, deployer, name, symbol, packed_socials)

deploy_protocol_token(name: String[64], symbol: String[32]) -> (address, address) external

Deploy the protocol token pair. System deployer only, callable once. Uses CREATE rather than CREATE2, so the address depends only on this factory and its internal nonce. No fee, no socials registration; the initial mint goes to the vesting contract.

Reverts
  • "Not system deployer"
  • "Protocol already deployed" — permanent one-shot lock
  • "Invalid name/symbol"
Emits

ProtocolPairDeployed(token, curve, deployer, name, symbol)

Deployer Registry

moveDeployerToken(token: address, old_deployer: address, new_deployer: address) external

Move a token between deployer enumerations on CTO finalization. Callable only by the primary hook / graduation manager. O(1) swap-and-pop on the old owner, append on the new.

Reverts
  • "Only hook" — caller is not the registered hook
getDeployerTokens(deployer: address) -> DynArray[address, 1024] view

Every token an address has ever launched, in any state. Intended for off-chain eth_call — the array can be large.

getDeployerTokenCount(deployer: address) -> uint256 view

Number of tokens launched by an address.

getDeployerTokenAt(deployer: address, i: uint256) -> address view

Paginated access, so on-chain callers never materialize the full array.

Reverts
  • "Index OOB"
Reading a deployer's track record

Combining getDeployerTokens() with each curve's is_graduated() / is_refund_mode() gives a deployer's graduation success rate without any indexer. The cap is 1,024 tokens per address; storage cost is per token held, not per cap, so the ceiling is effectively free.

View Functions

FunctionReturns
is_curve(addr) -> boolTrue only for curves this factory deployed. The hook gates graduation on it; any interface or indexer should gate token loading on it to reject cloned or self-registered tokens.
tokensByDeployer(addr) -> DynArrayPublic mapping accessor, same data as getDeployerTokens
protocol_deployed() -> boolWhether the one-shot protocol deploy has run
protocol_token() -> address$LP24 address
protocol_curve() -> address$LP24's bonding curve
get_config() -> (address, address, address)(token_master, bonding_curve_master, token_socials)
get_deployment_fee() -> uint256Chain deployment fee in wei
get_token_socials() -> addressTokenSocials address
get_system_deployer() -> addressThe one-shot protocol deployer key

Constants

ConstantBaseBSCPolygonRobinhoodGnosis
VANITY_PREFIX36 (0x24)
MAX_DEPLOYER_TOKENS1,024
deployment_fee0.06 ETH0.18 BNB1,440 POL0.06 ETH144 xDAI
INCLUSION_WINDOW10 blocks44 blocks12 blocks200 blocks5 blocks