Gas Optimizations
|
Issue |
Instances |
[GAS-01] |
Add non-zero check before calling function inside loop |
1 |
[GAS-02] |
Use == 0 instead of <= 0 for uint |
2 |
[GAS-03] |
Increments can be unchecked |
2 |
[GAS-04] |
Setting the constructor to payable |
2 |
[GAS-01] Add non-zero check before calling function inside loop
The function getAccountCollateralValue()
calls getUsdValue()
which is very gas consuming for each token of the s_collateralTokens
array even if the amount is 0 which case always returns 0.
Instance (1):
File: DSCEngine.sol
350: function getAccountCollateralValue(address user) public view returns (uint256 totalCollateralValueInUsd) {
for (uint256 i = 0; i < s_collateralTokens.length; i++) {
address token = s_collateralTokens[i];
uint256 amount = s_collateralDeposited[user][token];
totalCollateralValueInUsd += getUsdValue(token, amount);
}
return totalCollateralValueInUsd;
}
Apply this edit to avoid calling getUsdValue()
on 0 amount
File: DSCEngine.sol
350: function getAccountCollateralValue(address user) public view returns (uint256 totalCollateralValueInUsd) {
// loop through each collateral token, get the amount they have deposited, and map it to
// the price, to get the USD value
for (uint256 i = 0; i < s_collateralTokens.length; i++) {
address token = s_collateralTokens[i];
uint256 amount = s_collateralDeposited[user][token];
+ if (amount != 0) {
totalCollateralValueInUsd += getUsdValue(token, amount);
+ }
}
return totalCollateralValueInUsd;
}
[GAS-02] Use == 0
instead of <= 0
for uint
uint
cannot be less than 0, so == 0
is a sufficient check
Instances (2):
File: DecentralizedStableCoin.sol
48: if (_amount <= 0) {
61: if (_amount <= 0) {
[GAS-03] Increments can be unchecked
Increments in for loops as well as some uint256 iterators cannot realistically overflow as this would require too many iterations, so this can be unchecked
.
The unchecked
keyword is new in solidity version 0.8.0, so this only applies to that version or higher, which these instances are. This saves 30-40 gas PER LOOP.
Instances (2):
File: DSCEngine.sol
118: for (uint256 i = 0; i < tokenAddresses.length; i++) {
353: for (uint256 i = 0; i < s_collateralTokens.length; i++) {
[GAS-04] Setting the constructor
to payable
Saves ~13 gas per instance
Instances (2):
File: DecentralizedStableCoin.sol
44: constructor() ERC20("DecentralizedStableCoin", "DSC") {}
File: DSCEngine.sol
112: constructor(address[] memory tokenAddresses, address[] memory priceFeedAddresses, address dscAddress) {