40,000 USDC
View results
Submission Details
Severity: low
Valid

Constructor of `Escrow` should make sure that `buyer`, `seller`, `arbiter` are different from each other.

Summary

  • As arbiter should be impartial, when buyer or seller is same with arbiter, there would be unfair arbitration.

  • Buyer and seller might be same in case malicious buyer/seller might want to create an escrow to improve their auditing history.

Vulnerability Details

constructor(
uint256 price,
IERC20 tokenContract,
address buyer,
address seller,
address arbiter,
uint256 arbiterFee
) {
if (address(tokenContract) == address(0)) revert Escrow__TokenZeroAddress();
if (buyer == address(0)) revert Escrow__BuyerZeroAddress();
if (seller == address(0)) revert Escrow__SellerZeroAddress();
if (arbiterFee >= price) revert Escrow__FeeExceedsPrice(price, arbiterFee);
if (tokenContract.balanceOf(address(this)) < price) revert Escrow__MustDeployWithTokenBalance();
i_price = price;
i_tokenContract = tokenContract;
// @audit - it does not check if buyer != sellers and buyer != arbiter
i_buyer = buyer;
i_seller = seller;
i_arbiter = arbiter;
i_arbiterFee = arbiterFee;
}

Impact

Unfair arbitration might be possible or malicous auditor might abuse to increase his auditing profile.

Tools Used

Manual Review

Recommendations

constructor(
uint256 price,
IERC20 tokenContract,
address buyer,
address seller,
address arbiter,
uint256 arbiterFee
) {
if (address(tokenContract) == address(0)) revert Escrow__TokenZeroAddress();
if (buyer == address(0)) revert Escrow__BuyerZeroAddress();
if (seller == address(0)) revert Escrow__SellerZeroAddress();
if (arbiterFee >= price) revert Escrow__FeeExceedsPrice(price, arbiterFee);
if (tokenContract.balanceOf(address(this)) < price) revert Escrow__MustDeployWithTokenBalance();
i_price = price;
i_tokenContract = tokenContract;
// @audit - it does not check if buyer != sellers and buyer != arbiter
+ if (buyer == arbiter) revert Escrow__InvalidAddress();
+ if (seller == arbiter) revert Escrow__InvalidAddress();
+ if (buyer == seller) revert Escrow__InvalidAddress();
i_buyer = buyer;
i_seller = seller;
i_arbiter = arbiter;
i_arbiterFee = arbiterFee;
}

Support

FAQs

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