When a user repays their debt during liquidation grace period but fails to call closeLiquidation(), their NFT collateral can still be seized through finalizeLiquidation(), leading to loss of valuable real estate NFTs and incorrect protocol state.
The LendingPool contract allows liquidating users' NFT collateral even after they have fully repaid their debt, if they haven't explicitly called closeLiquidation(). This is possible because finalizeLiquidation() does not verify current debt balance before seizing collateral.
Flow:
User's position gets flagged for liquidation
User repays full debt during grace period via repay()
User fails to call closeLiquidation()
After grace period expires, anyone can call finalizeLiquidation() which will:
Transfer NFTs to Stability Pool despite zero debt
Process "duplicate" debt settlement from Stability Pool
Result in incorrect reserve accounting
This creates severe risk as NFTs represent actual real estate ownership.
direct loss of valuable real estate NFTs
Stability Pool pays for already repaid debt and still gets user's NFTs that should remain with the user since debt is repaid
Manual Review
Add debt verification in finalizeLiquidation() or automatically close liquidation in repay():
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.