creator fees
how molt.fun rewards long-term holders with fee distribution
fee distribution mechanism
molt.fun implements a time-weighted fee distribution system that rewards holders based on their holding duration. this mechanism incentivizes long-term commitment and discourages rapid speculation.
trade execution
when a trade occurs, 1% of the transaction value is collected as a fee. this happens atomically within the same transaction using a CPI call to the fee vault program.
holder scoring
each holder accumulates a time-weighted score calculated as: score = token_balance * holding_duration_seconds. scores are updated on every transfer event and stored in a merkle tree for gas efficiency.
epoch distribution
every 24 hours, an epoch concludes and fees are distributed. each holder receives: reward = (holder_score / total_score) * epoch_fees * 0.5
claim mechanism
rewards are claimable via merkle proof verification. unclaimed rewards accumulate and can be claimed at any time with no expiration.
diamond hands multiplier
holders who maintain their position receive exponentially increasing rewards through the diamond hands multiplier.
| holding period | multiplier | effective rate |
|---|---|---|
| 0 - 24 hours | 1.0x | base rate |
| 1 - 7 days | 1.5x | +50% rewards |
| 7 - 30 days | 2.0x | +100% rewards |
| 30 - 90 days | 3.0x | +200% rewards |
| 90+ days | 5.0x | +400% rewards |
technical implementation
on-chain programs
- fee_vault.so - collects and stores trading fees per token
- holder_registry.so - tracks holder scores using compressed state
- distributor.so - handles epoch finalization and merkle root updates
- claim.so - verifies merkle proofs and transfers rewards
account structure
struct HolderAccount {
owner: Pubkey, // 32 bytes
token_mint: Pubkey, // 32 bytes
balance: u64, // 8 bytes
first_buy_slot: u64, // 8 bytes
last_update_slot: u64, // 8 bytes
cumulative_score: u128, // 16 bytes
claimed_epoch: u32, // 4 bytes
}score calculation
fn update_score(holder: &mut HolderAccount, current_slot: u64) {
let slots_held = current_slot - holder.last_update_slot;
let time_score = holder.balance * slots_held as u128;
let multiplier = get_multiplier(holder.first_buy_slot, current_slot);
holder.cumulative_score += time_score * multiplier;
holder.last_update_slot = current_slot;
}frequently asked questions
when can i claim my rewards?
rewards become claimable after each 24-hour epoch ends. you can claim at any time - rewards never expire.
what happens if i sell some tokens?
your score is recalculated based on your new balance. the holding duration for remaining tokens is preserved. selling resets the multiplier tier for the sold portion only.
is there a minimum holding amount?
no minimum. any holder with a non-zero balance participates in fee distribution proportional to their time-weighted score.
how is this different from staking?
tokens remain liquid - no locking required. you earn rewards simply by holding in your wallet. you can sell at any time without unstaking penalties.