code4rena-2022-08-nounsdao-n06
[N‑06] Expressions for constant values such as a call to keccak256(), should use immutable rather than constant
Summary
expression, 계산된 값, constructor에서 전달된 값 등은 immutable 변수에 저장해야 한다고 제안한다.
Keyword
solidity, immutable, best practices
Vulnerability
- contracts/base/ERC721Checkpointable.sol#L59-L60
- contracts/governance/NounsDAOLogicV1.sol#L97-L98
- contracts/governance/NounsDAOLogicV2.sol#L101-L102
File: contracts/base/ERC721Checkpointable.sol
59 bytes32 public constant DOMAIN_TYPEHASH =
60: keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');
63 bytes32 public constant DELEGATION_TYPEHASH =
64: keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');File: contracts/governance/NounsDAOLogicV1.sol
97 bytes32 public constant DOMAIN_TYPEHASH =
98: keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');
101: bytes32 public constant BALLOT_TYPEHASH = keccak256('Ballot(uint256 proposalId,uint8 support)');File: contracts/governance/NounsDAOLogicV2.sol
101 bytes32 public constant DOMAIN_TYPEHASH =
102: keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');
105: bytes32 public constant BALLOT_TYPEHASH = keccak256('Ballot(uint256 proposalId,uint8 support)');constant와 immutable의 역할을 구별하여 이용하라고 제안한다. constant는 코드 상의 리터럴 값에 이용해야 하고, immutable은 expression, 계산된 값, constructor에서 전달된 값 등에 이용한다. 즉, keccak256 으로 계산된 값을 constant 에 넣는 것은 용도에 맞지 않는다는 의미이다.
Impact
변수 종류가 올바르지 않다.
Mitigation
expression, 계산된 값, constructor에서 전달된 값 등은 immutable 변수에 저장한다.
Memo
이런걸 받아줄지 않을지 의문.
tags: bughunting, nouns dao, readability, clean code, smart contract, solidity, solidity immutable, severity none