The MembershipFactory::upgradeTier function burns two lower-tier memberships for one higher-tier membership but fails to update the minted count, leading to inaccurate tracking of membership limits. This flaw allows users to bypass tier limits or prevents them from joining tiers with available spots.
DAOConfig.TierConfig.minted tracks the number of memberships minted for each tier, ensuring that no more than DAOConfig.TierConfig.amount memberships can be minted per tier.
However, when upgradeTier is called, it burns two lower-tier memberships to mint one higher-tier membership, but it doesn't update the DAOConfig.TierConfig.minted count.
This causes an accounting discrepancy: users may be able to mint memberships at tiers that are already full, or, conversely, be blocked from joining a tier that still has available slots.
Users can bypass tier limits or prevents them from joining tiers with available spots.
Manual review
Before calling mint() and burn() update state for DAOConfig.TierConfig.minted
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.