The escrow contract uses i_tokenContract.balanceOf(address(this)) throughout for transfers and checks instead of i_price, assuming they are equivalent. This makes the field i_price irrelevant to the Escrow contract. The balanceOf calls on lines 98, 110, and 125 should use i_price or i_price could be dropped from the Escrow contract entirely.
The check in the Escrow constructor is that the token contract balance is greater than the price, not that it actually equals the price which is inaccurate code with the later assumptions that use the balanceOf instead of i_price. This could have an unlikely but unchecked situation where the token contract balance is greater than the price of the escrow contract. Because the confirmReceipt and resolveDispute functions use tokenContract.balanceOf instead of i_price they would end up transferring more than the specified escrow price to the buyer or seller if the token contract balance is greater than the actual Escrow price.
The check in the constructor should be changed to actually check the token contract balance equals the price instead of the less than check on line 44.
Either Escrow.i_price should be used instead of balanceOf calls after that or the i_price field should be dropped since it isn't used in the rest of the contract code. If i_price is dropped as a field it needs to be removed from the constructor and getPrice should be updated to return i_tokenContract.balanceOf(address(this)) instead. This has some gas benefits whether i_price is dropped or used instead of balanceOf calls in the functions on lines 98, 110, and 125.
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.