Following math operations can be carried out unchecked since the conditions are checked on previous LOCs and will not underflow;
Vault.sol#L125- Condition checked on Vault.sol#L122Vault.sol#L130-L131 - Condition checked on Vault.sol#L127Vault.sol#L141 - Condition checked on Vault.sol#L122-L134Vault.sol#L423 - Condition checked on Vault.sol#L421Vault.sol#L440 - Condition checked on Vault.sol#L437Vault.sol#L444 - Condition checked on Vault.sol#L443Vault.sol#L452 - Condition checked on Vault.sol#L451Vault.sol#L482 - Condition checked on the same line
Vault.sol#L591 - Condition checked on Vault.sol#L589Vault.sol#L595 - Condition checked on Vault.sol#L593Vault.sol#L600 - Condition checked on Vault.sol#L599Vault.sol#L605 - Condition checked on Vault.sol#L603Vault.sol#L637 - Condition checked on Vault.sol#L635Vault.sol#L688 - Profit condition
Vault.sol#L695 - Condition checked on Vault.sol#L692-L693Vault.sol#L781 - Condition checked on the same line as a ternary operator
Vault.sol#L581 calls the function again inside same contract creating unnecessary function overloading (strategy.harvest();). Since it's not inheriting a function in outer contracts, function logic can be inlined directly in this line in order to save gas.
At Vault.sol#L323, _handleExcessDebt() is called which initiates a function triggering inside the same contract (not inheriting other contracts). However, the function logic can be inlined to executeDebtLimit() by passing required params/state variables to prevent SLOADs.
Caching .length inside loop functions will save gas, located at StakerVault.sol#L260 , RoleManager.sol#L80 ,TopUpActipn.sol#188 , TopUpKeeperHelper.sol#L43 , TopUpKeeperHelper.sol#L46 , TopUpKeeperHelper.sol#L72 , CompoundHandler.sol#135 , CTokenRegistry.sol#L61 , ConvexStrategyBase.sol#L313 , ConvexStrategyBase.sol#L380
Using unchecked {++i} instead of i++ will save gas.
Using immutable instead of constant variables will save gas.
Choosing either named return or explicit instead of specifying both may reduce gas due to unnecessary bytecode introduced. There is inconsistent use of implicit named return variables across the entire codebase which makes readability and maintainability hard.
Use bytes32 instead of string to save gas whenever possible.
String is a dynamic data structure and therefore is more gas consuming then bytes32.
You could use bytes32 instead of string in the following places: LiquidityPool.sol#L71 , PoolFactory.sol#L47-L48
GAS OPTIMIZATIONS
Following math operations can be carried out unchecked since the conditions are checked on previous LOCs and will not underflow;
Vault.sol#L125
- Condition checked onVault.sol#L122
Vault.sol#L130-L131
- Condition checked onVault.sol#L127
Vault.sol#L141
- Condition checked onVault.sol#L122-L134
Vault.sol#L423
- Condition checked onVault.sol#L421
Vault.sol#L440
- Condition checked onVault.sol#L437
Vault.sol#L444
- Condition checked onVault.sol#L443
Vault.sol#L452
- Condition checked onVault.sol#L451
Vault.sol#L482
- Condition checked on the same lineVault.sol#L591
- Condition checked onVault.sol#L589
Vault.sol#L595
- Condition checked onVault.sol#L593
Vault.sol#L600
- Condition checked onVault.sol#L599
Vault.sol#L605
- Condition checked onVault.sol#L603
Vault.sol#L637
- Condition checked onVault.sol#L635
Vault.sol#L688
- Profit conditionVault.sol#L695
- Condition checked onVault.sol#L692-L693
Vault.sol#L781
- Condition checked on the same line as a ternary operatorVault.sol#L581
calls the function again inside same contract creating unnecessary function overloading (strategy.harvest();
). Since it's not inheriting a function in outer contracts, function logic can be inlined directly in this line in order to save gas.At
Vault.sol#L323
,_handleExcessDebt()
is called which initiates a function triggering inside the same contract (not inheriting other contracts). However, the function logic can be inlined toexecuteDebtLimit()
by passing required params/state variables to prevent SLOADs.Caching
.length
inside loop functions will save gas, located atStakerVault.sol#L260
,RoleManager.sol#L80
,TopUpActipn.sol#188
,TopUpKeeperHelper.sol#L43
,TopUpKeeperHelper.sol#L46
,TopUpKeeperHelper.sol#L72
,CompoundHandler.sol#135
,CTokenRegistry.sol#L61
,ConvexStrategyBase.sol#L313
,ConvexStrategyBase.sol#L380
Using unchecked {++i} instead of i++ will save gas.
Using
immutable
instead ofconstant
variables will save gas.Choosing either named
return
or explicit instead of specifying both may reduce gas due to unnecessary bytecode introduced. There is inconsistent use of implicit named return variables across the entire codebase which makes readability and maintainability hard.Use bytes32 instead of string to save gas whenever possible. String is a dynamic data structure and therefore is more gas consuming then bytes32. You could use bytes32 instead of string in the following places:
LiquidityPool.sol#L71
,PoolFactory.sol#L47-L48