Golom contest - jayfromthe13th's results

An NFT marketplace that offers the lowest industry fee, a publicly available order-book along with analytical tools.

General Information

Platform: Code4rena

Start Date: 26/07/2022

Pot Size: $75,000 USDC

Total HM: 29

Participants: 179

Period: 6 days

Judge: LSDan

Total Solo HM: 6

Id: 148

League: ETH

Golom

Findings Distribution

Researcher Performance

Rank: 111/179

Findings: 2

Award: $56.49

🌟 Selected for report: 0

🚀 Solo Findings: 0

Lines of code

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L381 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L744 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L942 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L994 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L1166

Vulnerability details

Impact

Severity: Medium

Solidity integer division might truncate. As a result, performing multiplication before division can sometimes avoid loss of precision.

Tools Used

Truffle,hardhat, remix

Consider ordering multiplication before division.

Proof of Concept

If n is greater than oldSupply, coins will be zero. For example, with oldSupply = 5; n = 10, interest = 2, coins will be zero. If (oldSupply * interest / n) was used, coins would have been 1. In general, it's usually a good idea to re-arrange arithmetic to perform multiplication before division, unless the limit of a smaller type makes this dangerous.

Exploit Scenario:

contract A { function f(uint n) public { coins = (oldSupply / n) * interest; } }```

#0 - zeroexdead

2022-08-18T07:25:48Z

Duplicate of #833

#1 - dmvt

2022-10-17T16:00:25Z

There is a loss of precision, but its impact is minimal. Downgrading to QA

Splitting require() statements that use && save gas

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L538 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L894 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L1008 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L174-L178 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L894 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L239 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L325

Caching Length

LENGTH: Caching the length changes each of these to a DUP (3 gas), and gets rid of the extra DUP needed to store the stack offset.In particular, in for loops, when using the length of a storage array as the condition being checked after each loop, caching the array length in memory can yield significant gas savings if the array length is high.

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L415 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L240 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L269 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L293 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L143 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L157 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L180 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L183 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L226 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L258 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L273 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L199 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L189

Initialization: Let the default zero be applied instead of initializing default variable.

uint256 value; is cheaper than uint256 value = 0;.

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L415 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L240 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L269 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L293 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L143 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L157 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L180 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L183 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L226 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L258 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L273 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L199 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L189

++I Cost less gas than I++

Saves 6 gas PER LOOP

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L415 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L240 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L269 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L293 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L143 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L157 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L180 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L183 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L226 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L258 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L273 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L199 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L189

USE CUSTOM ERRORS RATHER THAN REVERT()/REQUIRE() STRINGS TO SAVE GAS

Custom errors are available from solidity version 0.8.4. Custom errors save ~50 gas each time they’re hitby avoiding having to allocate and store the revert string. Not defining the strings also save deployment gas. https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L538 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L540 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L646-L648 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L652 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L1227 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L1082 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L1011 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L996-L999 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L944-L946 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L927-L929 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L894-L897 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L245 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L211 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L186 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L72-L73 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L99 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L211-L212 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L217 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L227 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L455 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GolomToken.sol#L69-L70 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L184-L185

Calling constant will save gas.

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/test/WETH.sol#L7 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/test/WETH.sol#L6 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/test/WETH.sol#L5 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L71 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L323 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L79 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L915-L916 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L116 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L323 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L168 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowCore.sol#L323 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L185

Use external instead of public

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L284 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L312 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/core/GolomTrader.sol#L341 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/DummyRewardDistributor.sol#L37 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L98 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L141 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L155 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L215 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L254 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L269 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/test/ERC1155Mock.sol#L22 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/test/ERC721Mock.sol#L25 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/Timlock.sol#L55 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/Timlock.sol#L85 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/Timlock.sol#L120 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L167 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L232 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L262 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L281 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L307 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L324 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L350 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L401 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L416 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L427

USING CALLDATA INSTEAD OF MEMORY FOR READ-ONLY ARGUMENTS IN EXTERNAL FUNCTIONS SAVES GAS

https://github.com/code-423n4/2022-07-golom/blob/main/contracts/vote-escrow/VoteEscrowDelegation.sol#L131 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L310-L313 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L162-L166 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/GovernerBravo.sol#L320 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/Timlock.sol#L82-L83 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/governance/Timlock.sol#L117-L118 https://github.com/code-423n4/2022-07-golom/blob/main/contracts/rewards/RewardDistributor.sol#L141

AuditHub

A portfolio for auditors, a security profile for protocols, a hub for web3 security.

Built bymalatrax © 2024

Auditors

Browse

Contests

Browse

Get in touch

ContactTwitter