Skip to content

Latest commit

 

History

History
32 lines (31 loc) · 3.37 KB

identified-optimizations.md

File metadata and controls

32 lines (31 loc) · 3.37 KB

 

⚡Identified Gas Optimizations

Below are the currently identified optimizations that sstan identifies. If you would like to check out a list of patterns that are ready to be implemented and you would like to add them to the repo, you can check out the Contribution.md!

Optimization Description
address_balance Use selfbalance() instead of address(this).balance.
address_zero Use assembly to check for address(0).
assign_update_array_value When updating a value in an array with arithmetic, using array[index] += amount is cheaper than array[index] = array[index] + amount. This optimization also catches other arithmetic, bitwise and other operations.
bool_equals_bool Instead of if (x == bool), use if(x) or when applicable, use assembly with iszero(iszero(x)).
cache_array_length Cache array length during for loops.
cache_storage_in_memory Cache Storage Variables in Memory
constant_variables Mark storage variables as constant if they never change and are not marked as constants.
event_indexing Event is not properly indexed.
immutable_variables Mark storage variables as immutable if variables are assigned during deployment and never change afterwards.
increment_decrement Use unchecked{++i} instead of i++, or ++i (or use assembly when applicable). This also applies to decrementing as well.
memory_to_calldata Use calldata for function arguments marked as memory that do not get mutated.
multiple_require Use multiple require() statements instead of require(expression && expression && ...).
optimal_comparison Use strict > & < operators over >= & <= operators.
pack_storage_variables Tightly pack storage variables for efficient contract storage.
pack_struct_variables Tightly pack struct variables for efficient contract storage.
payable_function Mark functions as payable (with discretion).
private_constant Mark constant variables in storage as private to save gas.
read_storage_in_for_loop Avoid Reading From Storage in a for loop
safe_math_post_080 Identifies when SafeMath is being used if the contract using solidity >= 0.8.0. Using SafeMath when using version >= 0.8.0 is redundant and will incur additional gas costs.
safe_math_pre_080 Identifies when SafeMath is being used if the contract using solidity < 0.8.0. Consider using assembly with overflow/undeflow protection for math (add, sub, mul, div) instead of SafeMath.
shift_math Right shift or Left shift instead of dividing or multiplying by powers of two.
short_revert_string Use revert strings that fit in one word.
solidity_keccak256 Use assembly to hash instead of Solidity.
solidity_math Use assembly for math (add, sub, mul, div).
sstore Use assembly to write storage values.
string_error Use custom errors instead of string error messages for contracts using Solidity version >= 0.8.4.