The way minted field for each dao.tiers struct is being handled within the code is creating many issues.
Taking a closer look at how the mintedis being tracked, the state is not handled correctly at all, while some important checks/invariant are relying on this variable.
Notice the line under at MembershipFactory::L167/L168 is the only operation that handle the amount of mintedtoken per tier, when a token is initially minted through MembershipFactory::joinDAO() function.
Here after minting the value is incremented by 1 which is correct so far, but when burning and minting tokens for each tier at upgradeTier(), the minted value is never incremented nor decremented thus leading a discrepancy about the reality of the mint/burn operations that are being initiated for tokens, see MembershipFactory::L167/L168 line under.
Due to this a lot of issues are being introduced, first of all looking at the check that lies atMembershipFactory::L150
It ensures that minted does not exceed the amount field of tokens that can be available for a specific tier. But due to the mentioned issue, the limit will surely be reached at the pace that users are joining the DAO. When the limit is reached the DAO would be permanently DOSed, because minted never decreases even when burning the token thus leaving the check in a wrong state. Even if the admin "burns" tokens minted amount would still stay bricked.
Incorrect state of minted that impact major check.
DOS on core functionality for DAOs, joinDAO function affected.
Manual Review
Keep consistent track of all operations (mint/burn) and the current circulation of token according to their tiers
Highly recommended => the EXTERNAL_CALLER will likely have to burn/mint directly on the MembershipERC1155 contract.
Quoting protocol's answer on cyfrin finding 7.3.8:
One World Project: There is intentionally no process in place for a member to exit the DAO as per business logic.
They can be removed by burning their Membership NFTs through off-chain process by the EXTERNAL_CALLER
=> Record these action to avoid having an incorrect state.
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.