Lower than uint256 size storage instance variables are actually less gas efficient. E.g. using uint8 does not give any efficiency, actually, it is the opposite as EVM operates on default of 256-bit values so uint8 is more expensive in this case as it needs a conversion. It only gives improvements in cases where you can pack variables together, e.g. structs. For example, I think there is no reason to store nextDrawId (contract DrawBeacon) in uint32 or withdrawAccumulator (contract Reserve) in uint224. Same with loops, e.g. here uint8 does not give any efficiency:
for (uint8 i = 0; i <= maxWinningTierIndex; i++) {
Handle
pauliax
Vulnerability details
Impact
Lower than uint256 size storage instance variables are actually less gas efficient. E.g. using uint8 does not give any efficiency, actually, it is the opposite as EVM operates on default of 256-bit values so uint8 is more expensive in this case as it needs a conversion. It only gives improvements in cases where you can pack variables together, e.g. structs. For example, I think there is no reason to store nextDrawId (contract DrawBeacon) in uint32 or withdrawAccumulator (contract Reserve) in uint224. Same with loops, e.g. here uint8 does not give any efficiency: for (uint8 i = 0; i <= maxWinningTierIndex; i++) {