20,000 USDC
View results
Submission Details
Severity: gas
Valid

Using Storage instead of memory for structs/arrays saves gas

Summary

When fetching data from a storage location, assigning the data to a memory variable causes all fields of the struct/array to be read from
storage, which incurs a Gcoldsload (2100 gas) for each field of the struct/array.

If the fields are read from the new memory variable, they incur an additional MLOAD rather than a cheap stack read.

Instead of declearing the variable with the memory keyword, declaring the variable with the storage keyword and caching any fields that need to
be re-read in stack variables, will be much cheaper, only incuring the Gcoldsload for the fields actually read.

The only time it makes sense to read the whole struct/array into a memory variable, is if the full struct/array is being returned by the function, is being passed to a function that requires memory, or if the array/struct is being read from another memory array/struct

Vulnerability Details

https://github.com/Cyfrin/2023-07-beedle/blob/main/src/Lender.sol#L117

File: src/Lender.sol
117 Loan memory loan = loans[loanId];
249 Loan memory loan = Loan({
296 Loan memory loan = loans[loanId];
363 Loan memory loan = loans[loanId];
441 Loan memory loan = loans[loanId];
467 Loan memory loan = loans[loanId];
552 Loan memory loan = loans[loanId];
606 Loan memory loan = loans[loanId];

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.