The RAACNFT contract prevents burning NFTs by disallowing transfers to address(0), while also lacking functionality to withdraw deposited tokens, resulting in permanent token lockup after minting.
The RAACNFT::_update() function prevents transfers to address(0), which is the standard mechanism for burning NFTs in ERC721:
This means that users cannot burn their NFTs since the zero-address check prevents it, so once the NFT is minted, it cannot be destroyed.
However, the user paid with crvUSD tokens when minting the NFT, but he cannot get them back. Moreover, due to the absence of function for withdrawing the deposited tokens, even the contract owner cannot withdraw them, resulting in permanent token lockup.
Proof of Concept:
User mints an NFT by calling RAACNFT::mint with required tokens
The tokens are transferred to the contract and stored there
User attempts to burn the NFT but cannot due to address(0) check
The paid tokens remain locked in the contract permanently
Even the contract owner cannot withdraw the tokens due to missing functionality
Users cannot burn NFTs they no longer want
Tokens paid for minting are permanently locked in the contract
Consider adding a burn functionality, or a function for withdrawing the deposited tokens.
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.