Mo Ashouri
3 min readApr 15, 2022

--

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract GasOptimized{ uint public sum; function Is_Even(uint[] memory numbers) external {
for(uint i=0; i< numbers.length; i+=1){
bool isEven=numbers[i] % 2 ==0;
bool isLess99 = numbers[i] < 99;
if(isEven && isLess99){
sum+=numbers[i];
}
}
}

Trick 1: Change memory to calldata in the function argument

function Is_Even(uint[] calldata numbers) external { // calldata      for(uint i=0; i< numbers.length; i+=1){          bool isEven=numbers[i] % 2 ==0;
bool isLess99 = numbers[i] < 99;
if(isEven && isLess99){
sum+=numbers[i];
}
}
}

Trick 2: Short-Circuiting!

function Is_Even(uint[] calldata numbers) external {

uint _sum=sum;
for(uint i=0; i< numbers.length; i+=1){
// bool isEven=numbers[i] % 2 ==0; --> short circuiting
// bool isLess99 = numbers[i] < 99; --> short circuiting
if(numbers[i] % 2 ==0 && numbers[i] < 99){
_sum+=numbers[i];
}
}
sum=_sum; }

Trick 3 Loop Increment!

function Is_Even(uint[] calldata numbers) external {          uint _sum=sum;
for(uint i=0; i< numbers.length; ++i){ // --> loop increment
// bool isEven=numbers[i] % 2 ==0;
// bool isLess99 = numbers[i] < 99;
if(numbers[i] % 2 ==0 && numbers[i] < 99){
_sum+=numbers[i];
}
}
sum=_sum;

}

Trick 4: Loading local state variables into memory!

function Is_Even(uint[] calldata numbers) external {
uint _sum=sum; // < -- check here
uint _len=numbers.length;
for(uint i=0; i< _len; ++i){

// bool isEven=numbers[i] % 2 ==0;
// bool isLess99 = numbers[i] < 99;
if(numbers[i] % 2 ==0 && numbers[i] < 99){
_sum+=numbers[i];
}
}
sum=_sum; // and here <---

}

Trick 5: Loading array slots into memory

function Is_Even(uint[] calldata numbers) external {           //loading the local state into the local variable (memory)           uint _sum=sum;           uint _len=numbers.length;           for(uint i=0; i< _len; ++i){ // --> loop increment              // bool isEven=numbers[i] % 2 ==0;
// bool isLess99 = numbers[i] < 99;
uint num=numbers[i]; // caching an array slot into memory if(num % 2 ==0 && num < 99){
_sum+=num;
}
}
sum=_sum;

}

--

--

Mo Ashouri

Mo has a Ph.D. in Compter Science. Mo specializes in Backend Programming and Security.