Commit hash link:
https://github.com/0xMacro/student.kingofclubstroyDev/tree/56da370271130f72cf72dbc7942e1fb73774ba87
Audited by: Parth Patel (Parth#7949)
# General comments
Very well-written and secure code. All edge cases are covered. The code is easy to understand with all the comments. I couldn't find any bugs. I have added a few code-quality items that may be helpful.
# Issues
**[Q-1]** DAO shouldn't be able to receive ether other than membership fees
On [line 375-377](https://github.com/0xMacro/student.kingofclubstroyDev/blob/56da370271130f72cf72dbc7942e1fb73774ba87/dao/contracts/CollectorDAO.sol#L375-L377), CollectorDAO.sol has following code:
```solidity
receive() external payable {
}
```
In the discord discussion, it was mentioned that Membership fees are the only source of CollectorDAO revenue. [Source](https://discord.com/channels/870313767873962014/1020384282767786014/1021504068314742835)
Consider removing receive function
**[Q-2]** Inconsistent declaration of constant size.
On [line 9-15](https://github.com/0xMacro/student.kingofclubstroyDev/blob/56da370271130f72cf72dbc7942e1fb73774ba87/dao/contracts/CollectorDAO.sol#L9-L15), CollectorDAO.sol has following code:
```solidity!
uint public constant MEMBERSHIP_COST = 1 ether;
///@notice The amount of time voting occurs from the point in time a proposal is created
uint64 public constant VOTING_DURATION = 7 days;
///@notice minimum percent of total members that need to cast a vote on a proposal for it to pass
uint public constant QUORUM_PERCENT_REQUIREMENT = 25;
///@notice Reward sent to anyone that executes a passed proposal
uint public constant PROPOSAL_EXECUTION_REWARD = 0.01 ether;
```
The constant variable `VOTING_DURATION` is declared with `uint64` while other constant variables have default size i.e `uint256`.
Consider following a consistent size convention for constant variables. In the above case, all the constant variables can fit into uint64.
**[Q-3]** Use of values like `true` or `false` in conditional statement
On [line 137](https://github.com/0xMacro/student.kingofclubstroyDev/blob/56da370271130f72cf72dbc7942e1fb73774ba87/dao/contracts/CollectorDAO.sol#L137), [line 175](https://github.com/0xMacro/student.kingofclubstroyDev/blob/56da370271130f72cf72dbc7942e1fb73774ba87/dao/contracts/CollectorDAO.sol#L175), [line 189](https://github.com/0xMacro/student.kingofclubstroyDev/blob/56da370271130f72cf72dbc7942e1fb73774ba87/dao/contracts/CollectorDAO.sol#L189), CollectorDAO.sol has following code.
```solidity
if(proposals[proposalHash] == false) revert InvalidProposal();
if(success == false) revert ExecutionRewardFailed();
if(success == false) revert ProposalExecutionFailed(returnData);
```
The expressions `==` in the conditional statement evaluates to `true` or `false` and should not be checked explicitly.
Consider using the `!` operator instead of comparing it against `false` value.
Fixed code:
```solidity
if(!proposals[proposalHash]) revert InvalidProposal();
if(!success) revert ExecutionRewardFailed();
if(!success) revert ProposalExecutionFailed(returnData);
```