creator fees

how molt.fun rewards long-term holders with fee distribution

1%
trading fee
0.5%
to diamond hands
0.5%
to protocol

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.

01

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.

02

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.

03

epoch distribution

every 24 hours, an epoch concludes and fees are distributed. each holder receives: reward = (holder_score / total_score) * epoch_fees * 0.5

04

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 periodmultipliereffective rate
0 - 24 hours1.0xbase rate
1 - 7 days1.5x+50% rewards
7 - 30 days2.0x+100% rewards
30 - 90 days3.0x+200% rewards
90+ days5.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.