RedeemBlockReason:
    | "SYSTEM_TCR_BELOW_MCR"
    | "AMOUNT_ZERO"
    | "INSUFFICIENT_MUSD_BALANCE"
    | "NOTHING_REDEEMABLE"
    | "PARTIAL_BREACHES_DEBT_FLOOR"
    | "LAST_TROVE_IN_SYSTEM"

Why a redemption would be refused. Machine readable, in contract call order.

Type declaration

  • "SYSTEM_TCR_BELOW_MCR"

    _requireTCRoverMCR (TroveManager.sol:318, :1470-1475). A system condition, not yours.

  • "AMOUNT_ZERO"

    _requireAmountGreaterThanZero (:319, :1612-1614).

  • "INSUFFICIENT_MUSD_BALANCE"

    _requireMUSDBalanceCoversRedemption (:320, :1477-1486).

  • "NOTHING_REDEEMABLE"

    No Trove is at or above MCR, so the loop finds nothing and draws nothing.

  • "PARTIAL_BREACHES_DEBT_FLOOR"

    The one that had no field before MK-048. The amount falls in the gap: too large to take as a partial without pushing the first eligible Trove's net debt below minNetDebt, and too small to consume that Trove whole.

    Act on it with RedemptionPreview.maxWithoutConsuming or RedemptionPreview.nextViableAmount, which are the two edges of the gap.

  • "LAST_TROVE_IN_SYSTEM"

    A Trove the call would consume whole is the last one in the system (MK-245). Consuming it closes it, _closeTrove(_borrower, Status.closedByRedemption) (TroveManager.sol:1252-1261), and _closeTrove requires TroveOwners.length > 1 && sortedTroves.getSize() > 1 whenever BorrowerOperations is on the MUSD mint list (:1397-1399, :1488-1496). A failed require reverts the WHOLE call, unlike a cancelled partial, which only stops the loop. Both counts fall by one with every Trove the walk consumes, so a large enough redemption reaches it on a later Trove too.