Summary
updateMembershipImplementation
and setCurrencyManager
of MembershipFactory
is an important state change on the DAO.
Those should emit an event.
Vulnerability Details
updateDAOMembership, updateMembershipImplementation
and setCurrencyManager
should emit an event of MembershipFactory
.
Here is the updateDAOMembership
function of MembershipFactory
2024-11-one-world/contracts/dao/MembershipFactory.sol at main · Cyfrin/2024-11-one-world
function updateDAOMembership(string calldata ensName, TierConfig[] memory tierConfigs)
external onlyRole(EXTERNAL_CALLER) returns (address) {
address daoAddress = getENSAddress[ensName];
require(tierConfigs.length <= TIER_MAX, "Invalid tier count.");
require(tierConfigs.length > 0, "Invalid tier count.");
require(daoAddress != address(0), "DAO does not exist.");
DAOConfig storage dao = daos[daoAddress];
if(dao.daoType == DAOType.SPONSORED){
require(tierConfigs.length == TIER_MAX, "Invalid tier count.");
}
uint256 maxMembers = 0;
for (uint256 i = 0; i < tierConfigs.length; i++) {
if (i < dao.tiers.length) {
tierConfigs[i].minted = dao.tiers[i].minted;
}
}
delete dao.tiers;
for (uint256 i = 0; i < tierConfigs.length; i++) {
dao.tiers.push(tierConfigs[i]);
maxMembers += tierConfigs[i].amount;
}
if(maxMembers > dao.maxMembers){
dao.maxMembers = maxMembers;
}
dao.noOfTiers = tierConfigs.length;
return daoAddress;
}
2024-11-one-world/contracts/dao/MembershipFactory.sol at main · Cyfrin/2024-11-one-world
function updateMembershipImplementation(address newImplementation) external onlyRole(DEFAULT_ADMIN_ROLE) {
require(newImplementation != address(0), "Invalid address");
membershipImplementation = newImplementation;
}
2024-11-one-world/contracts/dao/MembershipFactory.sol at main · Cyfrin/2024-11-one-world
function setCurrencyManager(address newCurrencyManager) external onlyRole(DEFAULT_ADMIN_ROLE) {
require(newCurrencyManager != address(0), "Invalid address");
currencyManager = ICurrencyManager(newCurrencyManager);
}
Impact
It is recommended that an event be emitted on import state change.
Otherwise, without event logs, it becomes more difficult to track the state changes of the contract, especially in complex scenarios.
Tools Used
Manually Reviewed.
Recommendations
Emit an event after updating updateDAOMembership
, membershipImplementation
, setCurrencyManager
.