Beginner FriendlySolidity
100 EXP
View results
Submission Details
Severity: medium
Invalid

NFT assets can be permanently locked in contract if no beneficiary can afford to buy them out

Description:

The InheritanceManager contract provides only one mechanism to distribute NFT assets after inheritance mode is activated - the InheritanceManager::buyOutEstateNFT function, which requires a beneficiary to pay other beneficiaries for their shares:

function buyOutEstateNFT(uint256 _nftID) external onlyBeneficiaryWithIsInherited {
uint256 value = nftValue[_nftID];
uint256 divisor = beneficiaries.length;
uint256 multiplier = beneficiaries.length - 1;
uint256 finalAmount = (value / divisor) * multiplier;
IERC20(assetToPay).safeTransferFrom(msg.sender, address(this), finalAmount);
for (uint256 i = 0; i < beneficiaries.length; i++) {
if (msg.sender == beneficiaries[i]) {
return;
} else {
IERC20(assetToPay).safeTransfer(beneficiaries[i], finalAmount / divisor);
}
}
nft.burnEstate(_nftID);
}

This design creates a significant issue: if no beneficiary has the necessary funds or desire to buy out the NFT, the asset becomes permanently locked in the contract. There is no alternative mechanism to:

  • Sell the NFT to external parties

  • Transfer fractional ownership to beneficiaries

  • Allow beneficiaries to vote on NFT disposal

  • Auction the NFT with proceeds distributed to beneficiaries

The problem is especially serious for high-value NFTs, where the buyout amount could be substantial and beyond the means of individual beneficiaries.

Impact:

Potentially valuable NFT assets can become permanently trapped in the contract, with their value inaccessible to all beneficiaries. The primary purpose of the contract is to distribute assets, but this design flaw prevents complete distribution in many scenarios.

Recommended Mitigation:

Add alternative mechanisms for NFT distribution like NFT auction functionality for external parties

Updates

Lead Judging Commences

0xtimefliez Lead Judge 6 months ago
Submission Judgement Published
Invalidated
Reason: Design choice

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.