Staking & Locking
Locking $BCF (or a basket LP) into the bcLocker converts it into a non-transferable veBCF NFT. veBCF 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 BCF for 24 months: ve_i(t=0) = 10,000 · (24 / 48) = 5,000 veBCF ve_i(t=12 mo) = 10,000 · (12 / 48) = 2,500 veBCF ve_i(t=24 mo) = 0
Fee share
Every block, the FeeSplitter forwards 70% of protocol revenue to the bcLocker fee vault. A user's claim is proportional to their time-integrated veBCF 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 (bcUSD) | 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 veBCF Yield per veBCF (annualized): 9,835,000 / 72,000,000 = $0.1366 / veBCF / 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 BCF locked for 48mo, exit at month 12
returned = 10,000 · ( 1 − 0.50 · (36/48) )
= 10,000 · ( 1 − 0.375 )
= 6,250 BCF
penalty = 3,750 BCF → 3,000 to insurance, 750 burned