Redemptions
How a fyUSD holder converts stablecoin into collateral at the oracle price, which branches and which positions are touched, and what the fee does.
A redemption is the mechanism that puts a floor under fyUSD. Any holder may burn fyUSD and receive collateral at the oracle price, taken from the positions paying the lowest interest rates. It is not a liquidation: the redeemed borrower loses no value, because they give up collateral worth exactly the debt that is retired, less a fee that stays with them.
Redemptions are what make the borrower's chosen rate meaningful. A borrower who sets a very low rate borrows cheaply and accepts being first in line; a borrower who pays more moves back in the queue.
Conditions
redeem requires at least one eligible branch. A branch is eligible when it is activated, is not in BLIND, is not shut down, is not under a Closer REDEEM freeze, and is not within the first 24 hours of a token upgrade freeze (Rule R-7.1.1).
Redemption runs at every hour, in LIVE and in DRIFT alike. What changes out of session is the price and the fee, never the availability. The redeemer is served at pRedeem, the higher of the official print and the on-chain price clamped up by the recognition band, and pays an additional fee of up to 2% as confidence falls.
Guarantee
A redeemer never receives collateral valued below the last official print. A fall in the on-chain price is never recognised in a redeemer's favour, so pushing the price down buys nobody a cheaper claim on somebody else's collateral. The two directions are treated differently on purpose.
pRedeem is capped at 4% above the print on tier 1, the same distance the band allows below it. Version 0.4 considered tightening that cap to 2% and declined (decision D88). A tighter cap makes the redeemer's position better, not worse, on a genuine rise out of session: they burn fyUSD at par and receive collateral valued further below what the market would pay for it. The grievance it would have answered runs the other way and is bounded anyway, because pushing a pool 4% up costs a long position held across the whole weekend and only matters when the reserve is empty. A symmetric bound is not changed for an unlikely case on one side of it.
The earlier design switched redemptions off whenever the market was shut, leaving the peg to the PSM alone for 48 hours a week. That is what the confidence layer replaced: a redeemer out of session pays more and is served worse, which is enough. See Price regimes.
Redemption is not the weekend peg
A correction landed with version 0.4 and it matters for anyone reading the peg mechanics. Redemption holds the floor under fyUSD out of session only while the collateral has not fallen. Once it has, a redeemer burning fyUSD receives collateral that is falling too, at pRedeem ≥ pOfficial, which is above what the on-chain market will pay for it. Nobody does that trade. The line that holds in that state is the PSM reserve, and only the PSM reserve, which is why its published operational target is 10% of supply rather than the bottom of its range (Rule R-8.5.2). See PSM.
Risk
Being available is not being cheap. On a Saturday evening on tier 1 the fee is around 1.22% plus the base rate, against 0.5% plus the base rate in a live session, and the collateral is handed over at the higher of two prices. Redemption out of session only pays when fyUSD is genuinely below par.
Routing by uncovered debt
A redemption is split across eligible branches in proportion to how much of each branch's debt is not covered by its own Stability Pool (Rule R-7.2.1):
How it is calculated
unbacked_i = max(0, getEntireDebt_i − SP_i.totalDeposits); branch i receives unbacked_i / Σ unbacked of the redemption.
If every eligible branch is fully covered, the split falls back to pro rata total debt. An ineligible branch receives no share, and any fyUSD that cannot be consumed is returned to the redeemer — never burned without collateral in exchange.
The rationale is that redemption pressure should land where the protocol is least protected. A branch whose pool already covers its debt has a liquidation buffer; a branch whose pool is thin does not, and shrinking its debt is the useful thing to do.
Ordering inside a branch
The router walks SortedTroves from the lowest rate upward. Three categories are skipped (Rule R-7.3.1):
- Positions whose ICR is below the liquidation threshold. They belong to the liquidation path, not the redemption path; redeeming them would take collateral from a position that is already short of it.
- Positions opened less than
redemptionCooldown— 24 hours — ago. This prevents an attacker from opening a low-rate position and immediately redeeming through it in a single sequence. - Reduced positions, which are not in the sorted list at all.
maxIterationsPerBranch bounds gas and is supplied by the caller.
Execution against one position
For each position visited, with r the amount applied and price the branch's oracle price (Rule R-7.4.1):
r = min(remaining, debt)
collOut = r / price
feeColl = collOut × feeWad
redeemer receives collOut − feeColl
position keeps feeColl in its collateral
debt -= r
fyUSD burned = rGuarantee
The redemption fee stays inside the redeemed borrower's collateral. The protocol does not take a fee from the borrower who is redeemed against; it takes it from the redeemer, and it hands it to the borrower. A redeemed borrower ends the operation with a higher collateral ratio than they started with (Rule R-7.4.1, Rule R-7.5.2).
If the debt reaches zero, the position closes and all remaining collateral moves to collSurplus[user], claimable at any time (Rule R-7.4.2).
If the debt falls to a non-zero amount below minDebt, the position is marked reduced and removed from the sorted list. It can only be repaid, closed, liquidated, or brought back above minDebt by borrowing, at which point it is reinserted (Rule R-7.4.3).
Fee and baseRate
The fee has a fixed floor and a variable component that rises with redemption volume and decays with time (Rule R-7.5.1):
How it is calculated
baseRate(t) = baseRate × 0.5 ^ ((t − lastRedemption) / 6 h); after each redemption, baseRate += burned / fyUSD.totalSupply();
feeWad = min(100%, 0.5% + baseRate + 2% × (1 − confidence)).
The decay is a six-hour half-life applied through a precomputed per-minute factor. The caller passes maxFeeWad, and the call reverts if the resulting fee exceeds it — a redeemer is never surprised by a fee that moved between simulation and execution.
The economic shape: redeeming 1% of the supply raises the fee by one point, which decays to a quarter of that within twelve hours. Small arbitrage is cheap; a large sustained redemption becomes progressively expensive and gives borrowers time to react.
Redemption fees do not pass through the InterestRouter. They are never taken from the borrower being redeemed (Rule R-7.5.2).
What a borrower experiences
Being redeemed is not a loss. A borrower with 100 SPY and 30 000 fyUSD of debt, redeemed for 10 000 fyUSD at 500 USD per token, gives up 20 tokens less the fee, and their debt falls by 10 000. Their collateral ratio rises. What they lose is exposure: they hold less of the underlying than they did.
The front end therefore shows two things a borrower can act on (Rule R-15.1.7): a gauge of how far the position sits from the front of the queue, in positions and in fyUSD ahead of it, and a one-click rate increase. A borrower who does not want to manage this can delegate the rate to a bounded manager (Rule R-1.1.7).
Urgent redemptions
A shut branch, and any branch during Sunset, uses a different path (Rule R-7.6.1):
function urgentRedeem(address branch, uint256 amount, address[] calldata users, uint256 minCollOut) external;The differences from an ordinary redemption:
| Ordinary | Urgent | |
|---|---|---|
| Price | Current oracle price | lastGood on a shut branch; the live oracle price during Sunset |
| Collateral out | r / price | r × 1.02 / price, capped at the position's collateral |
| Fee | 0.5% plus baseRate | Zero |
Effect on baseRate | Increments it | None |
| Position selection | Sorted list, lowest rate first | Chosen freely by the redeemer |
| Availability | Every hour, outside BLIND | From urgentFrom onward, in every regime |
| Freezable by the Closer | Yes, up to 72 hours | Never |
The 2% bonus exists to make holders exit before borrowers have to, which is the ordering that leaves a shut branch solvent. If a position's collateral runs out with debt remaining, the remainder becomes bad debt.
urgentFrom is the shutdown timestamp for the mechanical causes — TCR below the shutdown ratio, a dead feed, an unresolved token upgrade — and the shutdown timestamp plus seven days when the Closer shut the branch. A discretionary closure gives borrowers a week to exit on their own terms; a mechanical one has no time to spare (Rule R-6.9.3).
Invariants
- For
burnedfyUSD burned, total debt across all touched branches falls by exactlyburned(Rule R-7.7.1). - Every
SortedTrovesretains its ordering after a redemption. - No position with an ICR below the liquidation threshold is ever touched by an ordinary redemption.
- After a partial redemption, the position's ICR is at least what it was before (Rule R-16.3 item 8).
- Unconsumed fyUSD is returned to the redeemer rather than burned.
Last reviewed: 2026-09-07 · Spec v0.4
Liquidations
Partial by default, confirmed before execution, throttled by measured liquidity, and paid for by a bonus that moves with conditions.
Stability Pool
Product-sum accounting, offsets, the ERC-4626 wrapper, the collateral sale that keeps shareholders in fyUSD, and the one-transaction USDG route.