Project

One World
NFTDeFi
15,000 USDC
View results
Submission Details
Severity: high
Invalid

Critical Centralization Risk Because Of Lack of Per-Address Membership Limits

Summary

The MembershipFactory contract has a critical design flaw in its joinDAO function where no limits exist on the number of memberships a single address can acquire. This oversight allows wealthy users to monopolize
entire membership tiers, effectively centralizing DAO control. Such users could accumulate all available slots in high-tier memberships, controlling governance voting power, profit distribution, and preventing other users from participating in the DAO.

Vulnerability Details

https://github.com/Cyfrin/2024-11-one-world/blob/1e872c7ab393c380010a507398d4b4caca1ae32b/contracts/dao/MembershipFactory.sol#L140

For example, a user with sufficient capital could:

  • Buy all tier 0 memberships (highest voting power)

  • Control majority of profit distribution

  • Influence all DAO decisions unilaterally

Impact

Governance Control:

  • Single user can dominate voting power

  • Defeats DAO's decentralization purpose

  • Can control profit distribution

  • Prevents fair participation

  • Blocks genuine members from joining

Protocol Trust:

  • Undermines DAO fairness

  • Discourages participation

  • Centralization risk

Tools Used

Manual Review

Recommendations

Make the MAX_PER_USER to be 2, so they can upgrade their tier in a sponsored DAO, but still to not be able to buy all of the tiers:

mapping(address => mapping(uint256 => uint256)) public userTierTokens;
function joinDAO(address daoAddress, uint256 tierIndex) external {
require(userTierTokens[msg.sender][tierIndex] < MAX_PER_USER,
"User tier limit reached");
userTierTokens[msg.sender][tierIndex] += 1;
// ... rest of function
}
Updates

Lead Judging Commences

0xbrivan2 Lead Judge 10 months ago
Submission Judgement Published
Invalidated
Reason: Design choice
0xbrivan2 Lead Judge 10 months ago
Submission Judgement Published
Invalidated
Reason: Design choice

Support

FAQs

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