In the liquidation process where users under liquidation can deposit additional NFTs as collateral. These NFTs are immediately seized, even if the user never borrowed against them. This violates the protocol's intended behavior where users under liquidation should only lose collateral tied to their debt, not newly added assets.
The depositNFT
function lacks a check for the user's liquidation status (isUnderLiquidation
). This allows users to add NFTs to their position after liquidation has been initiated but before finalization. During finalizeLiquidation()
, all deposited NFTs (including those added post-liquidation) are transferred to the Stability Pool, regardless of their relationship to the debt.
Missing Liquidation Check in depositNFT
:
NFT Seizure in finalizeLiquidation
:
Critical Severity: Users can lose NFTs deposited after liquidation initiation, even if those NFTs were never used as collateral for the debt.
Example Attack Flow:
User A has 1 NFT (Value: 100 crvUSD) and borrows 60 crvUSD (within 80% LTV).
NFT prices drop → liquidation is initiated on User A.
Before liquidation finalization, User A deposits a new NFT (Value: 200 crvUSD) via depositNFT()
.
Stability Pool calls finalizeLiquidation()
→ both NFTs are seized, even though the debt (60 crvUSD) only required 75 crvUSD (80% of 100 crvUSD) in collateral.
Users lose uncorrelated collateral, violating the principle that liquidation should only affect assets tied to the debt.
Manual review
Add a liquidation status check to depositNFT()
:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.