In the Escrow.resolveDispute contract there are multiple occasions in which state variables are used more than once. These state variables can be cached and used from the memory.
For example in the Escrow.resolveDispute the immutable state variable i_tokenContract is used five times inside the function scope. This requires five SLOAD operations separately. Where as i_tokenContract can be cached into a local variable and read from the memory. This will require one SLOAD and five MLOAD operations thus saving gas.
Similarly i_buyer, i_seller and i_arbiterFee are used 2 times each inside the function scope. Hence they can be cached and read from the memory to save gas as well.
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L120
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L123
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L125
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L127
> 0 CAN BE REPLACED WITH != 0In the Escrow.resolveDispute function, the token amounts are checked within if statements as follows:
if (buyerAward > 0) {
This can be replaced as follows to save gas:
if (buyerAward != 0) {
There are two more instances of this issue inside the Escrow.resolveDispute function.
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L119
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L122
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L126
nonReentrant MODIFIER CAN BE OMITTEDThe Escrow.resolveDispute function is called by the arbiter to resolve the disputes. Once the dispute is settled the arbiter can transfer the funds to the respective addresses. To avoid reentrancy which could occur as a result of moving the execution context to an external contract nonreentrant modifier is used in the resolveDispute. But this modifier is a redundant check and can be omitted due to following two reasons.
1. Before the fund transfer occurs the `s_state` is changed to `State.Resolved` state. If an attacker tries to reenter the function the transaction will revert due to the `inState(State.Disputed)` modifier in the `resolveDispute` function.
2. It is clearly mentioned that `ERC777` should not be used as a `tokenContract`. Hence there is no possibility for `execution context` to be moved to an `external contract`. Hence reentrancy is not a possibility here.
Hence it is recommended to remove the nonreentrant modifier in the resolveDispute function to save gas.
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L109
https://github.com/Cyfrin/2023-07-escrow/blob/main/src/Escrow.sol#L116
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.