One partial redemption, and the contract's band for it (MK-103).

What cancels a partial. _redeemCollateralFromTrove computes the Trove's resulting NICR at the price when the transaction MINES (TroveManager.sol:1224-1230, :1287-1290) and cancels the partial unless newNICR <= hint <= upperBoundNICR (:1299-1306). The upper bound differs from newNICR only by 600 seconds of interest at the GLOBAL rate on the Trove's principal (:1276-1285), a relative width of about rate * 600 / year, 1.9e-7 at 1%. A price rise lowers the collateral drawn and lifts newNICR above the hint; a fall lowers the upper bound under it. A cancel on the FIRST Trove drawn reverts the whole call (:392, :406-408); a cancel later just redeems less.

What the SDK does about it. It sends the CENTRE of the band as the hint, where getRedemptionHints returns its lower edge (HintHelpers.sol:143-160), which tolerated no rise at all. And it reports how far the price can move each way, so a caller can see that the band is narrow by construction: the tolerated move scales with remaining collateral / collateral drawn, so only a partial that draws a very small share of the Trove survives an ordinary block move.

interface PartialRedemption {
    hintNicr: bigint;
    lot: bigint;
    priceFragile: boolean;
    priceToleranceDown: bigint;
    priceToleranceUp: bigint;
    revertsCallIfCancelled: boolean;
    trove: `0x${string}`;
}

Properties

hintNicr: bigint

The NICR hint the SDK sends: the centre of [newNICR, upperBoundNICR] at price.

lot: bigint

MUSD the partial takes from it.

priceFragile: boolean

true when either tolerance is below REDEMPTION_PRICE_MOVE_TOLERANCE, the measured two block move. A fragile partial that revertsCallIfCancelled mostly reverts, and redeem() refuses to send it unless told to (acceptPriceFragilePartial).

priceToleranceDown: bigint

The largest price FALL, as a 1e18 fraction of price, the partial survives with that hint.

priceToleranceUp: bigint

The largest price RISE, as a 1e18 fraction of price, the partial survives with that hint.

revertsCallIfCancelled: boolean

true when it is the first Trove drawn, where a cancel reverts the whole call.

trove: `0x${string}`

The Trove the partial lands on.