If there is no arbiter, buyer can never retract the funds sent to escrow, causing tokens to be lost forever.
In Escrow.initiateDispute()
, if no arbiter is set by buyer, dispute can never be initiated.
The only way to retrieve back the funds is through buyer/seller first calling initiateDispute()
then arbiter calling resolveDispute()
. However, Escrow.resolveDispute()
will always revert due to the inState
modifier because initiateDispute()
cannot be called to set state of escrow to Dispute
.
In the above scenario, the only way to transfer funds out of escrow is for buyer to call confirmReceipt()
and send funds to seller.
Consider the scenario where there is no arbiter, and buyer is dissatisfied with seller delivery, but escrow contract is created with no arbiter.
In this case, there is no way for buyer to retrieve their funds sent to Escrow contract since both functions initiateDispute()
and resolveDispute()
cannot be called if there are no arbiter set as their tokens are locked forever in Escrow contract, unless they are willing to go ahead with payment via confirmReceipt()
.
Manual Analysis
Consider adding an additional onlyBuyer
function where withdrawal of escrowed funds by buyer is allowed when there is no arbiter set. However, set a delay so that buyer cannot immediately pull escrowed tokens to grief sellers payment.
In general start of audit to end of audit will normally not take more than 3 months.
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.