Overview
All protocol and app fees flow through the same contracts but are routed differently based on theirFeeKind.
FeeKind Routing
Every fee is tagged with aFeeKind that determines where it goes:
| FeeKind | Routing |
|---|---|
LAUNCH_FEE | 100% treasury |
TRADING_FEE | 80% contributors / 20% treasury |
TRANSFER_TAX | 80% contributors / 20% treasury |
CONTENT_SALE | 80% contributors / 20% treasury |
TOURNAMENT_FEE | 80% contributors / 20% treasury |
OTHER | 80% contributors / 20% treasury |
FeeCollector
The accounting layer. It tracks pending fee balances indexed by(appId, FeeKind, asset).
- Receives ELTA deposits via
depositElta(appId, kind, amount) - Receives app token deposits for transfer tax
- Sweeps accumulated balances to FeeSwapper via
sweep(appId, kind, asset) - Sweeping is permissionless (anyone can trigger it)
FeeSwapper
The routing layer (implementsIFeeRouterV2):
- If the app is paused in AppRegistry, 100% goes to treasury
- If the fee kind is
LAUNCH_FEE, 100% goes to treasury - Otherwise: treasury gets its take, the rest goes to ContributorSplit
Contributors receive their share through pull-based claims, not automatic distribution. They must actively claim their payouts from the ContributorSplit contract.
ContributorSplit
Each app has a ContributorSplit contract deployed at registration:- Shares-based: each contributor has a share weight; payouts are proportional
- Max 200 contributors (factory default, governance-configurable)
- Pull claims: contributors call
release(asset, account)to withdraw - Owner Safe controlled: only the app’s Safe can modify contributors
Next
Bonding Curve Basics
Price discovery mechanics
Community Systems
Governance and contributor splits
App Tokens
Token design and distribution