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

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