Violates Checks-Effects-Interactions
function withdrawEgg(uint256 tokenId) public {
// State updated BEFORE external call
storedEggs[tokenId] = false;
delete eggDepositors[tokenId];
eggNFT.transferFrom(address(this), msg.sender, tokenId); // 🚨 Reentrancy risk
}
A malicious NFT contract could re-enter and drain the vault
manual review
this snippet can be used for fix
function withdrawEgg(uint256 tokenId) external nonReentrant {
require(storedEggs[tokenId], "Egg not in vault");
require(eggDepositors[tokenId] == msg.sender, "Not depositor");
storedEggs[tokenId] = false;
delete eggDepositors[tokenId];
eggNFT.transferFrom(address(this), msg.sender, tokenId); // Safe after state update
}
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.