Staking & Locking
Locking $MRN (or a basket LP) into the mLocker converts it into a non-transferable veMRN NFT. veMRN grants three rights: (a) gauge vote weight, (b) boosted emissions on any basket you hold, and (c) a pro-rata share of protocol fees.
Lock parameters
Vote-weight decay
A lock's voting and boost weight decays linearly to zero at expiry. This forces active re-commitment and prevents zombie lockers from siphoning fee flow indefinitely.
ve_i(t) = amount_i · max( 0 , ( T_end,i − t ) / T_max ) with T_max = 48 months. Locking 10,000 MRN for 24 months: ve_i(t=0) = 10,000 · (24 / 48) = 5,000 veMRN ve_i(t=12 mo) = 10,000 · (12 / 48) = 2,500 veMRN ve_i(t=24 mo) = 0
Fee share
Every block, the FeeSplitter forwards 70% of protocol revenue to the mLocker fee vault. A user's claim is proportional to their time-integrated veMRN balance:
FeeClaim_i(Δt) = ( ∫_Δt ve_i(t) dt ) / ( ∫_Δt ve_total(t) dt ) · R_Δt Where R_Δt is the total USDC revenue routed to lockers over Δt.
Revenue sources feeding the locker vault
| Source | Rate | Locker share (70%) |
|---|---|---|
| Basket management fees | 15–25 bps of TVL | 10.5–17.5 bps |
| Redemption fees | 5 bps of exits | 3.5 bps |
| Borrow interest (mUSD) | 3–12% APR on debt | 2.1–8.4% |
| Liquidation penalties | 6% of liquidated collateral | 4.2% |
| Rebalance internalized spread | ≈2 bps of turnover | 1.4 bps |
Locker yield — worked example
Baseline: $500M TVL, 50% collateralized, 5% avg borrow APR.
Annual protocol revenue: R_mgmt = 0.0018 · 500,000,000 = 900,000 USDC R_borrow = 0.05 · 250,000,000 = 12,500,000 USDC R_redeem = 0.0005 · 100,000,000 = 50,000 USDC R_liquid = 0.06 · 10,000,000 = 600,000 USDC (est.) ──────────────────────────────────────────────────────── R_total = 14,050,000 USDC Locker share (70%): R_lockers = 9,835,000 USDC If 60% of circulating supply is locked, avg ve = 40% of amount: ve_total ≈ 0.60 · 300M · 0.40 = 72,000,000 veMRN Yield per veMRN (annualized): 9,835,000 / 72,000,000 = $0.1366 / veMRN / year
Early exit
A locker can burn their lock early. The penalty is 50% of the current time-decayed amount, split 40% to the insurance module and 10% burned:
Withdraw_early(amount, t):
returned = amount · ( 1 − 0.50 · ( T_end − t ) / T_max )
Example: 10,000 MRN locked for 48mo, exit at month 12
returned = 10,000 · ( 1 − 0.50 · (36/48) )
= 10,000 · ( 1 − 0.375 )
= 6,250 MRN
penalty = 3,750 MRN → 3,000 to insurance, 750 burned