https://dev.flare.network/assets/files/20250101-Coinspect-SmartContractAudit-Flare-Pre-Register&FTSOManagement-v250109-641fe6754b24f18d517711b2565426ce.pdf
FLRM-01 : Quorum is diluted when members are chilled after being added to the management group(관리 그룹 멤버가 된 후 징계 상태가 되어도 권한을 유지하기 때문에, 실제 의결에 필요한 최소 참여 인원 계산에 오류를 발생시키는 문제)
발견 위치
- flare-smart-contractsv2/contracts/governance/implementation/PollingManagementGroup.sol
0) 배경: 어디서 무엇을 체크하나?
멤버 추가 직전의 chilled(징계) 검사
// 최근 보상 에폭(=블록 구간) 동안 chilled 이력이 있으면 추가 거절
if (
voterRegistry.chilledUntilRewardEpochId(bytes20(voter)) +
addAfterNotChilledEpochs >= currentRewardEpoch
) {
revert("recently chilled");
}
- 멤버로 추가하려는 로직에만 최근 chilled 여부를 본다.
1) 멤버가 되면 어떤 권한이 생기나?
멤버를 추가하는 코드
function _addMember(
address _voterToAdd,
uint256 _currentRewardEpoch
) internal {
managementGroupMembers.add(_voterToAdd);
// 마지막 제안 ID 및 추가 시점 기록(메타데이터)
memberAddedAtProposal[_voterToAdd] = idCounter;
memberAddedAtRewardEpoch[_voterToAdd] = _currentRewardEpoch;
delete memberRemovedAtTs[_voterToAdd];
emit ManagementGroupMemberAdded(_voterToAdd);
}
- 멤버를 추가하는 코드 → 이 순간부터 _voterToAdd는 관리 그룹 멤버가 됨.
제
제안 하는 기능
function _canPropose(address _voter) internal view returns (bool) {
return managementGroupMembers.index[_voter] != 0;
}