The liquidateNFT
function in the NFTLiquidator contract allows multiple liquidations of the same NFT tokenId, each time re-minting IndexToken
for the same debt. This unguarded re-entry inflates the IndexToken
supply and undermines the auction system.
The code snippet never checks whether an NFT was already liquidated. Each call to liquidateNFT(tokenId, debt)
executes the same steps: transferring the NFT to the contract, updating its tokenData
, and minting new IndexToken
to the stabilityPool
.
This design breaks the expected guarantee a tokenId can only be liquidated once. If an attacker or compromised stabilityPool
calls liquidateNFT
repeatedly for the same tokenId, it triggers unlimited inflation of IndexToken
and overwrites any existing auction data for that NFT. This vulnerability depends on unbounded re-calls, where the malicious input is simply a second or third liquidation request for a token already seized.
I've rated this as a Medium because it leads to economic damage by inflating IndexToken
and corrupting the liquidation mechanism. An attacker can exploit it to acquire repeated tokens for the same debt and break the protocol’s reliability in handling NFT collateral. The likelihood is Medium if the stabilityPool
can freely invoke liquidateNFT
for arbitrary tokenIds. Repeated calls require no special conditions besides reusing the same tokenId
.
Manual Review
Add a one-time check to ensure each NFT tokenId is only liquidated once:
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.