The NFTLiquidator contract implements a critical liquidation mechanism that is completely broken due to two major design flaws:
The liquidateNFT() function can only be called by StabilityPool, but StabilityPool has no mechanism to call it
The function assumes StabilityPool has approved NFTLiquidator to transfer NFTs, but there's no approval mechanism in place
This creates a situation where NFTs can never enter the liquidation auction system, effectively breaking a core protocol mechanism.
Let's break down how the liquidation flow fails:
First, let's look at NFTLiquidator's requirements:
However, examining StabilityPool, we find:
No function to call liquidateNFT()
No approval mechanism for NFTLiquidator
No way to initiate the liquidation auction process
This creates a deadlock where:
NFTs can only be liquidated by StabilityPool (msg.sender check)
StabilityPool needs to approve NFTLiquidator (for transferFrom)
StabilityPool has no functions to do either
Result: NFTs can never enter the auction system
The transfer would fail in two ways:
The impact for this:
Core liquidation mechanism is completely broken
No way to liquidate NFTs through the intended auction system
Affects all liquidations, not just edge cases
No workaround available within current contract design
Could lead to protocol insolvency as bad debt cannot be liquidated
The root cause is a critical design flaw in the liquidation architecture:
NFTLiquidator expects StabilityPool to:
Call liquidateNFT()
Have approved NFT transfers
But StabilityPool has neither:
No function to call NFTLiquidator
No approval mechanism
This creates an impossible condition where liquidations can never occur
Manual review
The protocol needs to implement a complete liquidation flow. Two potential approaches:
Add required functionality to StabilityPool:
Redesign the liquidation flow:
Remove the StabilityPool requirement from NFTLiquidator
Allow LendingPool to directly initiate liquidations
Implement proper access controls and approval mechanisms
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.