Skip to main content

FEE staking

FEE is the protocol's value-capture token. Stakers earn a share of borrow interest the protocol collects, paid out in RD.

Stakers commit to a lockup tier when they stake. Longer lockups earn higher multipliers.

What stakers earn, and what they don't

  • Earn: borrow interest from every active branch, in RD. The protocol mints RD into the FEE staking contract and updates the per-share index.
  • Do not earn: redemption fees. Redemption fees are retained by the redeemed trove as residual collateral, not routed to stakers. (Mechanically: when a redeemer takes collateral out of a trove, only the net-of-fee amount actually leaves the trove; the fee portion stays inside the trove and increases its post-redemption ICR.)

So FEE staking is a play on borrow activity, not redemption activity.

The three tiers

TierLockupReward multiplier
Tier 07 days1.00×
Tier 130 days1.15×
Tier 290 days1.50×

The multiplier scales how big your share of the fee distribution is, relative to your stake size. A Tier 2 staker with 100 FEE locked has the same claim on rewards as 150 FEE worth of Tier 0 stake.

How rewards flow

  1. A borrower pays interest. Their branch's FeeRouter collects the RD.
  2. The branch's FeeRouter sends a fraction directly into the local Stability Pool (folded into depositor balances) and forwards the rest to the singleton GlobalFeeRouter.
  3. GlobalFeeRouter tops up keeper rewards, diverts a portion to bad-debt repair if needed, and splits the remainder between LP staking and FEE staking.
  4. The portion routed to FEE staking mints RD into the staking contract and updates the per-share index. Your pending RD gain grows.

You claim by interacting with the staking contract. Every state-touching call settles pending rewards automatically. There's no batch-claim deadline; rewards accumulate until you claim them.

Staking

There are two entry points:

stake(uint256 _FEEamount): top up an existing position. Keeps your current tier (and current lockup end-time). Requires the lockup to still be active; you can't top up an expired position with this function.

stakeWithTier(uint256 _FEEamount, uint8 _tier): explicit tier selection. Required when:

  • You don't yet have a position.
  • Your existing lockup has expired and you want to re-lock at any tier.
  • You want to switch tiers on an existing position (you can only switch up, e.g. tier 0 to tier 1, not down).

In all cases the lockup expiry is extended (or set) to now + tier_lockup. So if you top up 30 days into a 30-day lockup, you don't lose 30 days of lockup, but you also don't get the lockup re-set to a full 30 days unless you explicitly re-lock.

Unstaking

You can unstake any time after your lockup has expired. Before expiry, you can claim pending RD rewards but you cannot withdraw the FEE principal.

When you unstake, pending RD rewards are paid out automatically. Unstaking your full position closes the lockup and frees you to re-lock at any tier next time.

What you actually receive

  • RD only, from borrow interest across all branches.

If you want collateral exposure as part of your staking story, the protocol offers two other paths: Stability Pool deposits (which take collateral gains from liquidations) and LP staking (which earns FEE plus direct RD inflows). FEE staking is the pure-RD path.

When does FEE staking pay best?

  • High borrow activity. More outstanding debt across branches means more interest accruing, more RD flowing through the routers into stakers.
  • Long-tier stake. The 1.5× multiplier on a 90-day lockup is a meaningful share boost vs. 7-day.

It pays worst during very quiet periods (no borrowing growth) and during the 14-day bootstrap window before redemption is even possible (note: redemption doesn't affect staker income directly, but the bootstrap period is also generally a low-activity period for borrowing).

Common gotchas

  • Topping up an expired position. stake() reverts if your lockup has expired. The protocol forces you to make an explicit re-lock decision via stakeWithTier(). This is intentional: it prevents accidental auto-renewals.
  • Switching tiers. You can switch tiers by calling stakeWithTier() with the new tier on top of your existing stake. Mismatched tier on stake() (vs. your current tier) reverts.
  • Claiming without unstaking. Any state-touching call (e.g. stake(0)) settles pending rewards. There's usually a dedicated "claim" entrypoint for convenience.

Deep dive

  • Fees for how borrow interest is split before it reaches you.