CreatorGaugeController
Product role: Receives ShareOFT trade fees and splits them across vault-share burn, jackpot reserve, optional creator treasury, and protocol/voter branches — the onchain fee router for share holders.
Fee splitter and jackpot custodian for creator vaults. Payout authority for jackpots resides in CreatorLotteryManager, not the gauge itself.
Purpose
The GaugeController:
- Receives trading fees from ShareOFT
- Splits fees according to configured percentages
- Routes fees to lottery, burn, optional creator treasury, and voter/protocol branch
- Manages jackpot reserve for lottery payouts
Fee Split Configuration
// Default configuration (in basis points, 10000 = 100%)
uint256 public burnShareBps = 2139; // 21.39%
uint256 public lotteryShareBps = 6900; // 69%
uint256 public creatorShareBps = 0; // 0%
uint256 public protocolShareBps = 961; // 9.61%
Key Functions
Receiving Fees
// Receive OFT fees from ShareOFT
function receiveFees(uint256 amount) external;
// Receive WETH fees from V4 Tax Hook
function receiveWETHFees(uint256 amount) external;
// Direct deposit
function deposit(uint256 amount) external;
WETH Fee Processing
WETH fees accumulate in pendingWETHFees and are processed via a swap (WETH → CreatorCoin) then deposited into the vault and distributed as vault shares.
// Process pending WETH fees: WETH → CreatorCoin → Vault → Distribute
function processWETHFees() external;
Default MEV hardening behavior:
- Large WETH swaps are not permissionless by default (owner/keeper only).
- Permissionless execution can be enabled for small batches via a cap.
- Auto-processing on fee intake is disabled by default.
Relevant config (owner-only):
setWethFeeKeeper(address keeper)(optional)setWethProcessingConfig(uint256 maxPermissionlessWethProcess, bool autoProcessWethFees)
Distribution
// Distribute accumulated fees (permissionless)
function distribute() external;
// Force distribution (owner only, bypasses time check)
function forceDistribute() external onlyOwner;
Jackpot Management
// Pay jackpot to lottery winner (only lottery manager)
function payJackpot(address winner, uint256 shares) external;
// Get available jackpot reserve
function getJackpotReserve() external view returns (uint256);
Configuration
// Update fee split (must total 100%)
function setFeeSplit(
uint256 burnBps,
uint256 lotteryBps,
uint256 creatorBps,
uint256 protocolBps
) external onlyOwner;
// Update creator treasury (can be zero only when creatorShareBps == 0)
function setCreatorTreasury(address treasury) external onlyOwner;
Invariant guard:
- If
creatorBps > 0, creator treasury must be non-zero (CreatorTreasuryRequired).
Distribution Flow
ShareOFT sends fees
↓
receiveFees() accumulates pending
↓
distribute() triggered (threshold or manual)
↓
Unwrap OFT → vault shares
↓
Split according to configuration:
- 69% → jackpotReserve
- 21.39% → burn (increases PPS)
- creator% → creatorTreasury (if enabled)
- protocol/voter branch → voterRewardsDistributor, protocol treasury, or fallback (config-dependent)
Events
event FeesReceived(address indexed from, uint256 amount);
event FeesDistributed(uint256 burned, uint256 toLottery, uint256 toCreator, uint256 toProtocol, uint256 newPPS);
event JackpotPaid(address indexed winner, uint256 shares);
Was this page helpful?