Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gas Optimizations #340

Open
code423n4 opened this issue Jul 8, 2022 · 0 comments
Open

Gas Optimizations #340

code423n4 opened this issue Jul 8, 2022 · 0 comments
Labels

Comments

@code423n4
Copy link
Contributor

PREFIX INCREMENTS
-prefix cost lest gas then postfix. ++i vs i++
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L240
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L165
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L204
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L211
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L229
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L304
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSingleTokenPaymentTerminalStore.sol#L862
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L85
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L135
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L165
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBETHERC20SplitsPayer.sol#L466
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L139
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L167
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L275
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L276
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBController.sol#L913
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBController.sol#L1014

CACHING STORAGE VARIABLES IN MEMORY TO SAVE GAS
--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/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L204
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L211
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L229
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L304
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSingleTokenPaymentTerminalStore.sol#L862
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L85
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L135
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L165
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBETHERC20SplitsPayer.sol#L466
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L139
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L167
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L275
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBDirectory.sol#L276
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBController.sol#L913
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBController.sol#L1014

INITIALIZATION
--Let the default zero be applied instead of initializing default variable. this will save gas
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L240
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L165
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L204
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L211
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L229
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSplitsStore.sol#L304
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBSingleTokenPaymentTerminalStore.sol#L862
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBProjects.sol#L40
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L85
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L135
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBOperatorStore.sol#L165
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBETHERC20SplitsPayer.sol#L466
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBController.sol#L913

EXTERNAL INSTEAD OF PUBLIC
--Using external instead of public can save gas.
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestTokenFlow.sol#L191
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestTokenFlow.sol#L147
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestTokenFlow.sol#L76-L81
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L539
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L471
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L436
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L212
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L124
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L77
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestMultipleTerminals.sol#L157
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestLaunchProject.sol#L69
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestLaunchProject.sol#L50
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestERC20Terminal.sol#L169
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestERC20Terminal.sol#L60
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestEIP165.sol#L95
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestEIP165.sol#L110
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestEIP165.sol#L81
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestEIP165.sol#L64
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestEIP165.sol#L35
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestEIP165.sol#L22
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestAllowance.sol#L20
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestAllowance.sol#L63
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestAllowance.sol#L160

REQUIRE INSTEAD OF &&
--IMPACT:Require statements including conditions with the && operator can be broken down in multiple require statements to save gas.
--MITIGATION: Breakdown each condition in a separate require statement
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBTokenStore.sol#L293

COMPARISON OPERATORS
--In the EVM, there is no opcode for >= or <=. When using greater than or equal, two operations are performed: > and =. Therefore, using strict comparison operators hence saves gas
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L308
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestERC20Terminal.sol#L170
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestERC20Terminal.sol#L220
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestAllowance.sol#L257
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestAllowance.sol#L161
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestAllowance.sol#L165
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestAllowance.sol#L220
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBReconfigurationBufferBallot.sol#L79
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/JBController.sol#L1075

Constant declaration
-Constant state variables should be declared constant to save gas.
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestReconfigure.sol#L22
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestPayBurnRedeemFlow.sol#L27
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestPayBurnRedeemFlow.sol#L28
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestMultipleTerminals.sol#L24
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestMultipleTerminals.sol#L27
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestMultipleTerminals.sol#L26
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestERC20Terminal.sol#L17
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestDistributeHeldFee.sol#L23
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/TestDistributeHeldFee.sol#L24
https://github.com/jbx-protocol/juice-contracts-v2/blob/main/contracts/system_tests/helpers/TestBaseWorkflow.sol#L52

@code423n4 code423n4 added bug Something isn't working G (Gas Optimization) labels Jul 8, 2022
code423n4 added a commit that referenced this issue Jul 8, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants