Platform: Code4rena
Start Date: 05/08/2021
Pot Size: $50,000 USDC
Total HM: 9
Participants: 16
Period: 7 days
Judge: 0xean
Total Solo HM: 4
Id: 22
League: ETH
Rank: 14/16
Findings: 1
Award: $274.34
🌟 Selected for report: 1
🚀 Solo Findings: 0
24.5798 USDC - $24.58
hrkrshnn
Converting to immutable will decrease the cost of read from 2100 / 100 (depending on warm or cold) to just 3!
Warning: Variable declaration can be converted into an immutable. --> contracts/SyntheticToken.sol:18:3: | 18 | address public longShort; | ^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/SyntheticToken.sol:20:3: | 20 | address public staker; | ^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/SyntheticToken.sol:22:3: | 22 | uint32 public marketIndex; | ^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/SyntheticToken.sol:24:3: | 24 | bool public isLong; | ^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/TokenFactory.sol:16:3: | 16 | address public longShort; | ^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/YieldManagerAave.sol:25:3: | 25 | address public longShort; | ^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/YieldManagerAave.sol:27:3: | 27 | address public treasury; | ^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/YieldManagerAave.sol:31:3: | 31 | ERC20 public paymentToken; | ^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/YieldManagerAave.sol:34:3: | 34 | IERC20Upgradeable public aToken; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/YieldManagerAave.sol:36:3: | 36 | ILendingPool public lendingPool; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/YieldManagerAave.sol:38:3: | 38 | IAaveIncentivesController public aaveIncentivesController; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/YieldManagerAave.sol:41:3: | 41 | uint16 referralCode; | ^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerBand.sol:17:3: | 17 | IBandOracle public bandOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerChainlink.sol:16:3: | 16 | AggregatorV3Interface public chainlinkOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerChainlink.sol:17:3: | 17 | uint8 public oracleDecimals; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerEthKiller.sol:22:3: | 22 | IBandOracle public oracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerEthKillerChainlink.sol:21:3: | 21 | AggregatorV3Interface public tronOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerEthKillerChainlink.sol:22:3: | 22 | AggregatorV3Interface public eosOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerEthKillerChainlink.sol:23:3: | 23 | AggregatorV3Interface public xrpOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerEthVsBtc.sol:18:3: | 18 | AggregatorV3Interface public btcOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerEthVsBtc.sol:19:3: | 19 | AggregatorV3Interface public ethOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerFlippening_V0.sol:45:3: | 45 | AggregatorV3Interface public btcOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Variable declaration can be converted into an immutable. --> contracts/oracles/OracleManagerFlippening_V0.sol:46:3: | 46 | AggregatorV3Interface public ethOracle; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#0 - JasoonS
2021-08-12T11:31:42Z
Duplicate - #7
#1 - 0xean
2021-08-25T17:12:12Z
dupe #53
🌟 Selected for report: hrkrshnn
249.7566 USDC - $249.76
hrkrshnn
modified contracts/contracts/LongShort.sol @@ -1059,7 +1059,8 @@ contract LongShort is ILongShort, Initializable { /// @param user The address of the user for whom to execute the function for. /// @param marketIndexes An array of int32s which each uniquely identify a market. function executeOutstandingNextPriceSettlementsUserMulti(address user, uint32[] memory marketIndexes) external { - for (uint256 i = 0; i < marketIndexes.length; i++) { + uint length = marketIndexes.length; + for (uint256 i = 0; i < length; i++) { _executeOutstandingNextPriceSettlements(user, marketIndexes[i]); } }
In the previous case, at each iteration of the loop, length is read from
memory. something like mload(memory_offset)
. It takes 6
gas (3 for
mload
and 3 to place memory_offset
) in the stack.
In the replacement, the value is placed in the stack only once and each
iteration involves a dupN
(3 gas). Saves around 3 gas per iteration.
Here are other places that can use this.
./contracts/contracts/LongShort.sol:776: for (uint256 i = 0; i < marketIndexes.length; i++) { ./contracts/contracts/LongShort.sol:1063: for (uint256 i = 0; i < length; i++) { ./contracts/contracts/Staker.sol:790: for (uint256 i = 0; i < marketIndexes.length; i++) { ./contracts/contracts/mocks/BandOracleMock.sol:84: for (uint256 i = 0; i < _bases.length; i++) { ./contracts/contracts/testing/LongShortInternalStateSetters.sol:34: for (uint256 i = 0; i < marketIndexes.length; i++) {
#0 - JasoonS
2021-08-12T10:47:09Z
Thanks