This guide covers the current two-phase app launch path in AppFactory.
The protocol supports:
- Phase A: register app metadata + owner safe (no token yet)
- Phase B: launch token stack for that app ID
Legacy one-call createApp(...) still works and performs both phases.
- Local environment running
- ELTA approved for launch operations
- Owner safe address to control app config
| Parameter | Value |
|---|---|
| App creation fee | 10 ELTA |
| Curve seed | 100 ELTA |
| Total paid for full launch | 110 ELTA |
| App token supply | 10,000,000 |
| Allocation | 50% curve, 25% vesting, 25% ecosystem |
| Graduation target | 42,000 ELTA |
| LP lock default | 730 days |
ELTA.approve(address(appFactory), 10 ether);
(uint256 appId,) = appFactory.createAppWithoutToken(
ownerSafe,
"ipfs://app-metadata",
contributors
);What this does:
- charges launch fee
- deploys
ContributorSplit - registers app in
AppRegistry
ELTA.approve(address(appFactory), 100 ether);
(address token, address curve) = appFactory.launchTokenForApp(
appId,
"Neuro App Token",
"NEURO",
0, // 0 = default 10,000,000
operators
);What this deploys:
AppTokenAppBondingCurveAppStakingVaultAppVestingWalletAppEcosystemVault
createApp(...) still exists and internally runs both phases:
- fee collection + registration
- seed collection + token launch
- app exists in
AppRegistry tokenLaunched == true- curve reserves initialized with seed and curve allocation
- fee collector configured on token and curve
- operator/admin roles assigned correctly
- curve must be activated after delay
- early-buy gate defaults to
100 XPfor6 hours - curve buy fee comes from
AppFeeRouter.feeBps()(default1%) - fees are accumulated and swept into
FeeCollector
Graduation happens when target is reached (or forced at deadline):
- Uniswap V2 pair created/used
- reserve assets added as LP
- LP locked in
LpLocker - factory receives graduation callback
- forgetting to approve ELTA separately for fee and seed steps
- assuming creator allocation is auto-staked (it is vesting + ecosystem buckets in current factory flow)
- forgetting to activate a pending curve before trading
- setting no fee collector, which breaks transfer-tax routing expectations
| Contract | Source |
|---|---|
| AppFactory | src/apps/AppFactory.sol |
| AppToken | src/apps/AppToken.sol |
| AppBondingCurve | src/apps/AppBondingCurve.sol |
| AppRegistry | src/registry/AppRegistry.sol |
| ContributorSplit | src/contributors/ContributorSplit.sol |
| FeeCollector | src/fees/FeeCollector.sol |
| AppStakingVault | src/apps/AppStakingVault.sol |
- TOKENOMICS.md — Understanding the broader economic design
- ARCHITECTURE.md — How all contracts fit together
- LOCAL_DEVELOPMENT.md — Testing your integration locally