code4rena-2022-08-nounsdao-n07
[N‑07] Constant redefined elsewhere
Summary
동일한 constant를 여러 컨트랙트에서 중복하여 정의하면 추후 값이 바뀌어야 할 때 모든 컨트랙트에서 수정하는 것을 까먹어 싱크가 안 맞는 상황이 생길 수 있다. 따라서 constant는 한 군데에서만 정의하는 게 좋다고 제안했다.
Keyword
clean code
Vulnerability
File: contracts/governance/NounsDAOLogicV2.sol
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
59: string public constant name = 'Nouns DAO';
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
62: uint256 public constant MIN_PROPOSAL_THRESHOLD_BPS = 1; // 1 basis point or 0.01%
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
65: uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000; // 1,000 basis points or 10%
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
68: uint256 public constant MIN_VOTING_PERIOD = 5_760; // About 24 hours
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
71: uint256 public constant MAX_VOTING_PERIOD = 80_640; // About 2 weeks
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
74: uint256 public constant MIN_VOTING_DELAY = 1;
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
77: uint256 public constant MAX_VOTING_DELAY = 40_320; // About 1 week
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
89: uint256 public constant MAX_QUORUM_VOTES_BPS = 2_000; // 2,000 basis points or 20%
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
92: uint256 public constant proposalMaxOperations = 10; // 10 actions
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
101 bytes32 public constant DOMAIN_TYPEHASH =
102: keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');
/// @audit seen in contracts/governance/NounsDAOLogicV1.sol
105: bytes32 public constant BALLOT_TYPEHASH = keccak256('Ballot(uint256 proposalId,uint8 support)');동일한 constant를 여러 컨트랙트에서 중복하여 정의하면 추후 값이 바뀌어야 할 때 모든 컨트랙트에서 수정하는 것을 까먹어 싱크가 안 맞는 상황이 생길 수 있다. 따라서 constant는 한 군데에서만 정의하는 게 좋다고 제안했다.
Impact
constant를 수정하고자 할 때, 까먹고 다른 컨트랙트는 수정하지 않는 상황이 발생할 수 있다.
Mitigation
라이브러리를 이용하여 한번만 정의한 후 공유해 사용하는 방법을 추천하였다. library 이용 트릭을 참고하면 library의 internal 함수로 작성하면 낮은 가스로 접근하면서 constant 관련 코드를 따로 관리할 수 있다.
Memo
별걸 다… library 를 이용해도 메리트가 있는지는 잘 모르겠다.
tags: bughunting, nouns dao, clean code, smart contract, solidity, severity none